4.3 面向复用的设计模式
为什么要使用可重用的设计模式?
设计……
使灵活性能够更改(可重用性)
在修复旧问题时尽量减少引入新问题(可维护性)
允许在初始交付之后交付更多的功能(可扩展)。
设计模式:对软件设计中给定上下文中经常出现的问题的通用的、可重用的解决方案。
OO设计模式通常显示类或对象之间的关系和交互,而不指定涉及的最终应用程序类或对象。除了类本身,设计模式更强调多
个类/对象之间的关系和交互过程—比接口/类复用的粒度更大
设计模式分类法
创建型模式:关注对象创建的过程
结构型模式:处理类或对象的组合
行为类模式:描述类或对象交互和分配职责的方式。
1.结构模式
(1)适配器模式
适配器模式
意图:将类的接口转换为客户端期望获得的另一个接口。
解决类之间接口不兼容的问题
通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。
对象:将旧组件重用到新系统(也称为“包装器”)
加个“适配器”以便于复用
2种适配器设计模式
——继承
——委托
(2)装饰器模式
装饰器模式的激励示例
如果你想要堆栈数据结构的各种扩展…
- UndoStack:一个堆栈,让您撤消以前的推或弹出操作
SecureStack:需要密码的堆栈 - SynchronizedStack:序列化并发访问的堆栈
——用每个子类实现不同的特性
任意可组合的扩展:
- SecureUndoStack:一个需要密码的栈,并且允许你撤销以前的操作
- SynchronizedUndoStack:一个序列化并发访问的栈,也允许你撤销以前的操作
- SecureSynchronizedStack:……
- SecureSynchronizedUndoStack:……
继承的局限性
结合继承层次结构
——组合爆炸
——大规模代码复制
装饰器
问题:你需要对单个对象进行任意或动态组合的扩展。
解决方案:将公共接口实现为要扩展的对象,添加功能,但将主要职责委托给底层对象。
以递归的方式实现
后果:
-比静态继承更灵活
-可定制的、内聚的扩展
decorator使用子类型和委托
接口:定义装饰物执行的公共操作
起始对象:在其基础上增加功能(装饰),将通用的方法放到此对象中
Decorator抽象类是所有装饰类的基类,里面包含的成员变量component 指向了被装饰的对象。
ConcreteDecorator类是可以添加特性的实际装饰类。您可以拥有任意数量的ConcreteDecorator类,每个类都代表一个可以添加的特性。
装饰与继承
▪Decorator在运行时组合特性
-继承在编译时组合特性
▪装饰器由多个协作对象组成
-继承产生一个单一的、明确类型的对象
▪可以混合搭配多种装饰
多重继承在概念上是困难的
java.util.Collections的修饰符
将一个可变列表变成一个不可变列表:
static List<T> unmodifiableList