面向复用的设计模式(Adaptor,Decorator,Facade)
什么是设计模式?
1)设计模式:对软件设计中给定上下文中常见问题的通用的、可重用的解决方案。
2)除了类本身,设计模式更强调多个类/对象之间的关系和交互过程—比接口/类复用的粒度更大。
设计模式可分为哪些类?
1)创建型模式
2)结构型模式
3)行为类模式
Adapter 适配器模式
Adapter pattern的作用
Adapter将某个类/接口转换为client期望的其他形式,解决类之间接口不兼容的问题,又可以通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。
Adapter Design Pattern的两种类型
Inheritance继承
Delegation委托
Adaptor的两种实例
Decorator 装饰器模式
Decorator的一个启发式实例
假设你要使用栈数据结构的不同的延伸性方法:
UndoStack: 一个允许撤消以前的push或pop操作的堆栈
SecureStack: 需要密码的堆栈
SynchronizedStack: 序列化并发访问的堆栈
如果需要特性的任意组合呢?
SecureUndoStack: 一个需要密码的堆栈,它还允许您撤消以前的操作
SynchronizedUndoStack: 一个堆栈,它序列化并允许您撤消以前的操作
假设我们要完成后三种方法:使用普通的继承做法会导致组合爆炸和大量的代码重复
Decoorator的实现
问题的关键在于为对象增加不同侧面的特性,对每一个特性构造子类,通过委派机制增加到对象上。
以递归的方式实现Decorator
接口:定义装饰物执行的公共操作
起始对象,在其基础上增加功能(装饰),将通用的方法放到此对象中
Decorator抽象类是所有装饰类的基类,里面包含的成员变量component 指向了被装饰的对象。
Decorator实例1
客户端需要一个具有多种特性的object,通过一层一层的装饰来实现
Decorator实例2
Decorator vs. Inheritance
- 装饰器在运行时组成特征
- 装饰器由多个协作对象组成
- 装饰器能混合搭配多个装饰品.
Facade 外观模式
问题的提出:客户端需要怎样通过一个简化的接口来访问复杂系统内的功能?
解决的方法:Facade提供一个统一的接口来取代一系列小接口调用,相当于对复杂系统做了一个封装,简化客户端使用,这样子就可以便于客户端学习使用,解耦。