您的位置:首页 > 其它

一起来学设计模式(5)——适配器模式

2011-09-01 17:36 162 查看
生活中,我们将插头插在插座上来取电,到了有些国家,插座格式不支持插头,理论上,可以有以下三种做法:

1. 将插头改装一下,使之符合插座;

2. 将插座改装一下,使之符合插头;

3. 找一个适配器,介于插头和插座之间;

无疑,前两种实现方法代价比较大,而且不灵活。比如,采用第一种方法,回国后还得改装回来。对于第三种方法,即没有修改现有的对象,也具有很高的灵活性。

具体来说,假设A类使用到了B类提供的方法,当用C类替换B类之后,C类和B类的为A类提供的接口有差别,在不修改A类,也不修改C类的情况下,如何使得A类可以使用C类。

下面就以此为例,来实现相关的代码,所采用的模式就是适配器模式。假设用户User之前使用的是中国插座,释放方法是getValue,美国的插座的使用方法是getNumber,为了不修改User调用getValue方法,创建了一个适配器Adapter。

/**
* @file Adapter.h
* @brief 
* @author Don Hao
* @date 2011-9-1 17:14:51
* @version 
* <pre><b>copyright: </b></pre>
* <pre><b>email: </b>hao.limin@gmail.com</pre>
* <pre><b>company: </b>http://blog.csdn.net/donhao</pre>
* <pre><b>All rights reserved.</b></pre>
* <pre><b>modification:</b></pre>
* <pre>Write modifications here.</pre>
*/
#ifndef _ADAPTER_H
#define _ADAPTER_H

class SocketUSA
{
public:
    int getNumber()
    {
        return 0;
    }
};

class SocketChina
{
public:
    int getValue()
    {
        return 0;
    }
};

class Adapter : SocketChina
{
public:
    Adapter(SocketUSA s)
    {
        this->s = s; 
    }

    int getValue()
    {
        return s.getNumber();
    }

private:
    SocketUSA s;
};

class User
{
public:
    void plugin()
    {
        SocketUSA s;
        Adapter a(s);
        a.getValue();
    }
};

#endif /**< _ADAPTER_H */



/**
* @file Adapter.cpp
* @brief 
* @author Don Hao
* @date 2011-9-1 17:14:57
* @version 
* <pre><b>copyright: </b></pre>
* <pre><b>email: </b>hao.limin@gmail.com</pre>
* <pre><b>company: </b>http://blog.csdn.net/donhao</pre>
* <pre><b>All rights reserved.</b></pre>
* <pre><b>modification:</b></pre>
* <pre>Write modifications here.</pre>
*/
#include "Adapter.h"

void main()
{
    User u;
    u.plugin();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: