-
可复用性的概念
何为可复用性?顾名思义,就是可以用来再次使用,而我们追求可复用性就是为了降低后续开发的时间成本,提高工作效率。
优点
- 降低成本和开发时间
- 经过充分的测试,可靠、稳定
- 标准化,在不同应用中保持一致
- 复用的四个层面:
-
LSP(Liskov Substitution Principle 里氏替换原则)
Java中的编译器强制执行的规则(静态类型检查):
- 子类型可以增加方法,但不可删除方法
- 子类型需要实现抽象类型中的所有未实现方法
- 协变:子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
- 逆变:子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数
- 子类型中重写的方法不能抛出额外的异常
也适用于指定的行为(方法):
- Same or stronger invariants 更强的不变量
- Same or weaker preconditions 更弱的前置条件
- Same or stronger postconditions 更强的后置条件
上述例子是符合不变量、前置条件、后置条件的方法
而在这个例子中,不变量是不可以比较的,没有强弱之说,是不符合LSP的要求的,所以这个正方形不是矩形的行为子类型吗。
总结:对输入的要求降低,对输出的要求提高。输入的要求要变低,所以参数类型要更抽象,输出要求更高,所以返回值和异常要不变或更具体
-
继承(Inherita)&委托(Delegation)
- “委托”发生在object层面
- “继承”发生在class层面
继承
子类继承父类,相当于继承父亲的内容,打上了父亲的烙印,始终有联系
委托
理解:(依赖)相当于请别人帮忙,这个事情(方法)完成后这种关系也随之断开。(接口)
(如果写死在了构造方法或者rep中就是永久的delegation,如关联,组合,聚合)
聚合,新类里用到了别的类的对象,用构造方法来传入参数绑定
组合,写死在rep或构造函数中,即new了一个新的对象(别的类的)
-
黑盒框架 & 白盒框架
黑盒框架
delegation,只调用框架给出的接口中的方法,方法的实现依据派生的子类型不同而不同。
- 通过实现特定接口进行框架扩展,采用的是delegation机制达到这种目的,通常采用的设计模式是策略模式(Strategy)和观察者模式(Observer);
- 黑盒所预留的是一个接口,在框架中只调用接口中的方法,而接口中方法的实现就依据派生出的子类型的不同而不同,它的客户端启动的就是框架本身。
白盒框架
继承和重写,依据已经写好的框架,想要新方法只能override
- 通过继承和重写实现功能的扩展,通常的设计模式是模板模式(Template Method);
- 白盒框架所执行的是框架所写好的代码,只有通过override其方法来实现新的功能,客户端启动的的是第三方开发者派生的子类型。
-
面向复用的设计模式
adapter适配器模式:多增加一个接口来隐藏子类,以此适应已有的类和client需求不适配
Decorator装饰者模式:客户端需要多种特性的object,逐层装饰委派实现功能加到对象上
facade外观模式:用一个统一的简化的接口来替代一系列的小接口,以此实现对复杂系统的封装,而且有了这个接口也方便client学习使用。
strategy策略模式:实现不同的抽象接口(使用不同的算法)运行时根据client倾向传入对应的算法类,防止算法写死在程序里,增加灵活性。
Template Method模板方法模式:(白盒框架)共性的步骤就在抽象类里面统一实现,不同的步骤在不同的子类里单独实现,使用继承和重写。由于已知哪些是共性的哪些是差异性的,所以可知已知代码内容,所以是白盒(就如同不同的交通方式交通前往异地,统一的有:买票,等候,上车/机,行驶,到站下车/机,步骤相同,但具体实现方式不同)
iterator迭代器模式:目的就是不管对象在哪一个容器/集合里面,都可以遍历。在ADT内写一个iterator接口,就可以实现hasnext(),next(),remove()方法啦。
-
小结
可复用性是很具有经济价值的一种思想,但不是所有的可复用都省钱,利用已经完成的可复用方法、框架、软件是节省成本的,但是如果目的是开发一套可复用的框架,那成本反而会增加很多。