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

时间:2022-11-01 22:01:43

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

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();
}