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-

 

 

 

 

 


posted on 2006-09-29 15:15  ColorSky  阅读(224)  评论(0编辑  收藏  举报