6-7章,Façade, Adapter模式
Façade模式
例1:如果要使用一个极其复杂的现有系统的部分功能,是小组的人都去学习这个系统呢,还是我们抽签决定,输的人负责研究老系统,编写例程,供其它人用?
例2:对于使用操作系统提供的繁杂的底层功能,Windows操作系统提供了一组类库Win32 API,简化对操作系统底层调用?
解决方案:
标准图:
意图 希望简化原有系统的使用方式,定义自己的接口。
问题 只需使用某个复杂系统的子集,或需要以一种特殊的方式与系统交互
解决方案 Façade为原有系统的客户提供一个新或者简化的接口,使系统更容易使用
参与者和协作者 接口本身和各个子系统
效果 Façade模式简化了对所需子系统的使用,但是由于Façade并不完整,因此客户可能无法使用某些功能
实现 让使用算法的类(Context)包含一个抽象策略类(Strategy)
该抽象类定义一个抽象方法指定如何调用
Adapter模式
例1:定制一个画图程序,设计如下:
要增加一个Circle类,而且我们发现另外一个人已经编写了一个处理圆形的类,叫XXCircle。方法命名为:
DisplayIT, FillIt,UndisplayIT。我们不能直接使用XXCircle,也不可能修改XXCircle类。因此采用Adapter模式,调用XXCircle.
例2:.Net 程序如果要调用已有的Com组件,.Net IDE会生成一个InterOPXXX.dll,包装Com的接口,供.Net程序调用。
解决方案:
标准图:
意图 使控制范围之外的一个原有对象和某个接口匹配
问题 系统的数据和行为都正确,但接口不符
解决方案 Adapter模式提供了具有所需接口的包装类
参与者和协作者 Adapter改变了Adaptee的接口,使Adaptee与Adapter的基类Target匹配。这样Client就可以使用Adaptee
效果 Adapter模式使原有对象能够适应新的类结构,不受其接口限制
实现 将原有类包含在另一个类之中。
让包含类与需要的接口匹配,调用被包容类的方法
比较:
Façade模式 Adapter模式
是否存在既有的类? 是 是
是否必须按某个接口设计? 否 是
对象需要多态行为? 否 可能
需要更简单的接口吗? 是 否
--End-