软件构造学习笔记第四章

软件构造学习笔记第四章

复用的层次 最主要是代码的复用
软件构造过程中任何实体都可能被复用
白盒复用 源代码可见 可修改和扩展 可定制化程度高 需要对内部有充分的了解(主要的方式是继承)
黑盒复用 源代码不可见 简单清晰 但是适应性较差(委托(不需要知道具体细节))
显示委托和隐式委托
显示委托;明确表示调用对象的哪个功能
隐式委托;客户表达需求,但不知道是谁做的和怎么做的。

要实现这个LSP原则,就是要做到可以用到父类的地方,一定可以使用子类。
只需要做到以下几点:
1.比起父类,子类的前置条件不能更强。
2.比起父类,子类的后置条件不能更弱。
3.比起父类,子类的不变量不能更弱。
4.比起父类,子类型的方法参数只能逆变或者相同。
5.子类型的返回值只能协变或者相同。
6.子类型的异常类型只能协变,也就是不允许抛出比父类更多的异常。
总结:父类型能干,子类型就能干。而且子类型干的更好。

LSP子类型多态 客户端可以用统一的方法处理不同类型的对象
1.子类型可以增加方法 但是不可以删除方法
2.子类型要实现抽象类型中所有未实现的方法
3.子类型中重写的方法必须要求使用同样类型的参数并且返回同样类型的值而且这个重写的方法不能抛出新的异常
4. 更强的不变量 更弱的前置条件 更强的后置条件
其中1,2,3能在静态检测中被检测出来。

协变 父类型->子类型 :越来越具体 返回值类型不变或者变得更具体
异常类型不变或者变的更具体
反协变 父类型到子类型 越来越抽象 参数类型不变或者越来越抽象
数组是协变的对于所有T类型的数组 可以接收T的所有子类

设计模式:

  1. Adapter适配器模式
    将某个类/接口转换为用户期望的其他形式 增加一个接口将已经存在的子类封装卡里 从而能够隐藏具体子类 通过修改接口让无法合作的类进行合作
    软件构造学习笔记第四章
    2装饰模式:
     装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比 生成子类更灵活。(主要的方式是委托)
    3行为设计模式:
    对于同一个问题有不同的解答,客户端希望在不同的策略间切换。