设计模式七:Adapter(适配器)——类对象结构型模式

结构型模式:
结构型模式设计到如何组织类和对象以获得更大的结构。


结构型类模式:

采用继承机制来组合接口或实现。简单的例子是采用多重继承,这一模式尤其有助于多个独立开发的类库协同工作。
结构型对象模式:

不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法,因为可以在运行时刻改变对象组合关系,所以有更大的灵活性。

 


Adapter(适配器)——类对象结构型模式

1.意图
将一个类的结构转换成客户希望的另外一个接口。adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。

 

2.别名
包装器wrapper

 

3.动机
有时候,为了复用而设计的工具想不能够被复用的原因仅仅是因为他的接口与专业应用领域所需要的接口不匹配。

 

4.适用性
你想使用一个已经存在的类,而他的接口不符合你的要求
你想创建一个可以复用的类,该类可以与其他不相关的类或者不可预见的类协同工作
(仅适用于对象adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配他们的接口。对象适配器可以适配他的父类接口

 

5.结构

类适配器

3954160472831404095

对象适配器

3954160472831404109

参考:http://www.cnblogs.com/zhxiang/archive/2012/01/14/2322565.html

 


6.参与者
target
定义client使用的与特定领域相关的接口
client
与符合target接口的对象协同
adaptee
定义一个已经存在的接口,这个接口需要适配
adapter
对adaptee的接口与target接口进行适配

 

7.协同
client在adapter实例上调用一些操作,接着适配器调用adaptee的操作实现这个请求

 

8.效果
类适配器和对象适配器有不同的权衡
类适配器:
1)用一个具体的adapter类对adaptee和target进行匹配。但是当我们想要匹配一个类以及所有他的子类时,类adapter就不能胜任工作
2)使得adapter可以重新定义adaptee的部分行为,因为adapter是adaptee的一个子类
3)仅仅引入了一个对象,并不需要额外的指针以简洁得到了adaptee
对象适配器:
1)允许一个adaper与多个adaptee即adaptee及其所有子类,可以一次对其所有子类添加功能
2)使重定义adaptee的行为比较困难。

需要考虑的其他因素
1)adapter的匹配程度
adapter的工作量取决于target接口与adapter接口的相似程度
2)可插入的adapter
当其他类使用一个类时,如果所需的假定条件越少,这个类就更具有可复用性。如果将接口匹配构建为一个类,就不需要假定对其他的类的可见的是一个相同的接口。
3)使用双向匹配器以提供透明操作
被适配的对象不再兼容adaptee的接口,因此不是所有adaptee的对象都可以被使用的地方它都可以被使用。

 

9.实现
1)使用c++实现适配器类时,应该用公有方式继承target类,用私有方式继承adaptee类。
2)可插入的适配器
首先要为adaptee找到一个窄接口,即可用于适配的最小操作集。
然后有三种实现方式:使用抽象操作、使用代理对象、参数化的适配器

 

10.代码实现

类适配器:

#include<iostream>
using namespace std;

class target
{
    public:
    target()
    {
        cout<<"target generated"<<endl;
    }
    virtual void request()
    {
        cout<<"target request"<<endl;
    }
};

class adaptee
{
    public:
    adaptee()
    {
        cout<<"adaptee generated"<<endl;
    }
    void specifiedRequest()
    {
        cout<<"adaptee specifiedRequest"<<endl;
    }
};

class adapter:public target, private adaptee
{
    public:
    adapter()
    {
        cout<<"adapter generated"<<endl;
    }
    void request()
    {
        adaptee::specifiedRequest();
    }
};

int main()
{
    target *t = new adapter;
    t->request();
    return 0;
}

对象适配器

#include<iostream>
using namespace std;

class target
{
    public:
    target()
    {
        cout<<"target generated"<<endl;
    }
    virtual void request()
    {
        cout<<"target request"<<endl;
    }
};

class adaptee
{
    public:
    adaptee()
    {
        cout<<"adaptee generated"<<endl;
    }
    void specifiedRequest()
    {
        cout<<"adaptee specifiedRequest"<<endl;
    }
};

class adapter:public target
{
    public:
    adapter()
    {
        cout<<"adapter generated"<<endl;
    }
    void request()
    {
        ad.specifiedRequest();
    }
    private:
    adaptee ad;
};

int main()
{
    target *t = new adapter;
    t->request();
    return 0;
}

 

 

 

11.相关模式
bridge模式的结构与对象适配器类似,但是出发点不同,其目的是将接口部分和实现部分分离,从而对他们可以较为容易也相对独立的加以改变。
而adapter则意味着改变一个已有对象的接口。
decorator模式增强了其他对象的功能而同时又不改变他的接口。因此其对程序的透明性比适配器好,可以进行递归组合,而适配器不行。
模式proxy在不改变他的接口的条件下,为另一个对象定义了一个代理

 

 

posted @ 2012-05-19 10:41  w0w0  阅读(357)  评论(0)    收藏  举报