本文主要讲述面向关键质量目标的软件构造基本技术之面向复用的设计模式。
1 原因
降低成本和开发时间
经过充分测试,非常可靠和稳定
标准化,能在不同的应用中保持一致
2 设计模式
2.1 Adapter适配器模式
解决的问题:适配器模式解决了接口间不兼容的问题,如果我们想要复用已经存在的类,但是现有的类和我们想要实现的类接口不兼容,适配器模式通过增加一个适配器,将已有的类封装起来,从而解决接口不兼容的问题。
设配器模式有两种形式:
1.继承:Java中提供了一种方式可以实现类与类之间的复用,但通常需要在实现之前设计继承层次结构,但不能取消父类中的方法,使用时需要小心;
2.委托:委托是一个对象仅依赖另一个对象完成其功能的一部分的一种形式,可以说是一种低层次的共享实体之间代码和数据的一种机制。
如果子类只需要复用父类中的一小部分方法,就可以不使用继承而是使用委托,从而避免继承大量无用的方法。因此组合通常优先于继承。委托发生在对象层面,而继承发生在类的层面。
来看一个实例:一个员工父类有一个计算雇员的奖金的方法。
不同的子类(经理,程序员和秘书等)都需要重写这个方法以满足不同的奖金计算模式。
思考两个问题:如果一个人的职位发生变动如何处理?如果两个子类计算奖金的方式一样如何处理?
这里核心的问题就是对员工的奖金计算方法的差别在对象的层面而非类的层面。因此可以考虑将计算奖金的方法抽象成一个接口,通过委托的机制实现。
2.2 Decorator装饰器模式
解决的问题:装饰器模式解决了大幅度修改类的问题。如果一个类具有多个不同功能,直接将不同的功能共同封装到这一个类,那么仅改变一个小功能就需要大幅度改变原有的类。装饰器模式通过对每个功能构造一个单独的类,通过委托机制利用现有的类增加到我们需要实现的类中。这时功能改变我们只需要委托另一个改变了功能的类,而不用更改其他类。
2.3 Facade外观模式
解决的问题:使客户端通过一个统一的接口来访问系统的功能,而不是通过很多小的接口访问,方便客户端的使用。
2.4 Strategy策略模式
解决的问题:策略模式使客户端可以自由选择实现某一个功能的不同方法。如果一个功能有多种不同的方法,策略模式通过为不同的实现算法构造抽象接口,用不同的算法实现不同的类,委托给相应的类来完成客户端的需求,运行时根据客户端传入的参数进行动态选择。
2.5 Iterator迭代器模式
解决的问题:迭代器模式使得客户端能够无视集合的类型遍历集合类中的ADT对象。迭代器模式通过让自己的集合类利用Iterator接口,实现自己特有的Iterator迭代器,允许客户端利用这个迭代器进行显式或隐式的迭代遍历。