场景
有时,我们需要使用一个工具类的功能,而该类提供的接口却与我们需要的类型不匹配。我们可以通过修改工具类的源码使得该接口兼容我们需要的类型,但前提是我们有这个工具类的源码。然而即使得到了源码,为了实现一个应用,工具类就不得不改变自己的接口,这样做会使得工具类毫无意义。这时,我们需要做的就是定义一个新的类来适配接口。
定义
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容的类能够一起工作。
结构
适配器的实现有多种:对象适配器与类适配器。其中对象适配器的耦合度较低,所以如果能使用对象适配器的情况,我们都推荐使用对象适配器。
- Target:我们需要的目标接口。
- Adaptee:定义一个已经存在的接口,该接口需要适配。
- Adapter:对Adaptee的接口与Target接口进行适配。
实现
现实中,我们日常使用的三孔插头就有许多不同的版本,而为了能够方便使用,我们可以通过转接头来使用各种插孔,这与适配器模式相同。
- 对象适配器
Target:
class TargetSocket{
public:
virtual void socket() = 0;
};
Adaptee:
class OwnSocket{
public:
void SockeA(){
std::cout << "SocketType :A" << std::endl;
}
};
Adapter:
class SocketAdapter : public TargetSocket{
public:
SocketAdapter():m_socket(new OwnSocket()){}
~SocketAdapter(){delete m_socket;}
void socket(){
m_socket->SocketA();
}
private:
OwnSocket* m_socket;
};
Client:
int main(){
TargetSocket* pSocket = new SocketAdapter();
pSocket->socket();
return 0;
}
- 类适配器
Target:
class TargetSocket{
public:
virtual void socket() = 0;
};
Adaptee:
class OwnSocket{
public:
void SockeA(){
std::cout << "SocketType :A" << std::endl;
}
};
Adapter:
class SocketAdapter : public TargetSocket ,OwnSocket{
public:
void socket(){
SocketA();
}
};