设计模式解析(五)——几种设计模式之Facade和Adapter

由于个人时间原因,无法详细描述这些模式,暂且记录下来以后慢慢补充详细。

Facade模式

 

Facade模式:关键特征  
意图 希望简化原有系统的使用方式。需要定义自己的接口。
问题 只需使用某个复杂系统的子集,或者,需要以一种特殊的方式与系统交互。
解决方案 Facade为原有系统的客户提供了一个新的接口。
参与者与协作者 为客户提供一个简化接口,是系统更容易使用。
效果 Facade模式简化了对所需子系统的使用过程。但是,由于Facade并不完整,因此客户可能无法使用某些功能。
实现 1、定义一个(或多个)具备所需接口的新类。
2、让新的类使用原有的系统。

Adapter模式

 

Adapter模式:关键特征  
意图 使控制范围之外的一个原有对象与某个接口匹配。
问题 系统的数据和行为都正确,但接口不符。通常用于必须从抽象类派生时。
解决方案 Adapter模式提供了具有所需接口的包装类。
参与者与协作者 Adapter改变了Adaptee的接口,使Adaptee与Adapter的基类Target匹配。这样Client就可以使用Adaptee了,好像它是Target类型。
效果 Adapter模式使原有对象能够适应新的类结构,不受其接口的限制。
实现 将原有类包含在另一个类中。让包含类与需要的接口匹配,调用被包容类的方法。

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模式

是否存在既有的类?

是否必须按照某个接口设计?

对象需要多态行为吗?

可能

需要更简单的接口吗?

 

未完待续……

posted @ 2013-03-08 21:51  sirocco  阅读(394)  评论(0编辑  收藏  举报