设计模式解析(五)——几种设计模式之Facade和Adapter
由于个人时间原因,无法详细描述这些模式,暂且记录下来以后慢慢补充详细。
Facade模式
Facade模式:关键特征 | |
意图 | 希望简化原有系统的使用方式。需要定义自己的接口。 |
问题 | 只需使用某个复杂系统的子集,或者,需要以一种特殊的方式与系统交互。 |
解决方案 | Facade为原有系统的客户提供了一个新的接口。 |
参与者与协作者 | 为客户提供一个简化接口,是系统更容易使用。 |
效果 | Facade模式简化了对所需子系统的使用过程。但是,由于Facade并不完整,因此客户可能无法使用某些功能。 |
实现 | 1、定义一个(或多个)具备所需接口的新类。 2、让新的类使用原有的系统。 |
Adapter模式
Adapter模式:关键特征 | |
意图 | 使控制范围之外的一个原有对象与某个接口匹配。 |
问题 | 系统的数据和行为都正确,但接口不符。通常用于必须从抽象类派生时。 |
解决方案 | Adapter模式提供了具有所需接口的包装类。 |
参与者与协作者 | Adapter改变了Adaptee的接口,使Adaptee与Adapter的基类Target匹配。这样Client就可以使用Adaptee了,好像它是Target类型。 |
效果 | Adapter模式使原有对象能够适应新的类结构,不受其接口的限制。 |
实现 | 将原有类包含在另一个类中。让包含类与需要的接口匹配,调用被包容类的方法。 |
图1、Adapter模式的通用结构图
一个Adapter模式的例子
//Shape.h #pragma once class Shape { public: Shape(void); void virtual display()= 0; public: ~Shape(void); };
//Shape.cpp #include "Shape.h" Shape::Shape(void) { } Shape::~Shape(void) { }
//Circle.h #pragma once #include "Shape.h" #include "XX_Circle.h" class Circle : public Shape { public: Circle(XX_Circle *xxCircle); void display(); public: ~Circle(void); private: XX_Circle *myXX_Circle; };
//Circle.cpp #include "Circle.h" Circle::Circle(XX_Circle *xxCircle) { myXX_Circle = xxCircle; } Circle::~Circle(void) { delete myXX_Circle; } void Circle::display() { myXX_Circle->displayIt(); }
//XX_Circle.h #pragma once class XX_Circle { public: XX_Circle(void); void displayIt(); public: ~XX_Circle(void); };
//XX_Circle.cpp #include "XX_Circle.h" XX_Circle::XX_Circle(void) { } XX_Circle::~XX_Circle(void) { }
Facade模式与Adapter模式的比较
Facade模式 |
Adapter模式 |
|
是否存在既有的类? |
是 |
是 |
是否必须按照某个接口设计? |
否 |
是 |
对象需要多态行为吗? |
否 |
可能 |
需要更简单的接口吗? |
是 |
否 |
未完待续……