适配器结构和组成
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另一个接口。这种模式通常用于使原本由于接口不兼容而不能一起工作的类能够协同工作。
结构和组成
适配器模式涉及以下几个核心组件:
目标接口(Target Interface):客户端期望的接口,也是适配器要实现的接口。
适配器(Adapter):适配器是一个实现了目标接口的类,它持有一个对适配者对象的引用,并将客户端的请求转发给适配者。
适配者(Adaptee):需要被适配的现有类,它的接口与目标接口不兼容。
示例
假设有一个现有的英国插座(Adaptee),但我们需要一个能够在欧洲使用的插座(Target Interface)。我们可以使用适配器模式来实现一个适配器,将英国插座转换为欧洲插座。
1.定义目标接口
首先,我们定义一个欧洲插座的接口:
// Target Interface
class EuropeanSocketInterface {
public:
virtual void power() = 0;
virtual ~EuropeanSocketInterface() {}
};
2.实现适配者
接下来,我们有一个英国插座(适配者),它有不同的接口:`
// Adaptee (existing UK socket)
class BritishSocket {
public:
void plugIn() {
std::cout << "Plugged into British socket" << std::endl;
}
};
3.实现适配器
现在,我们创建一个适配器,使得英国插座可以符合欧洲插座的接口要求:
// Adapter
class SocketAdapter : public EuropeanSocketInterface {
private:
BritishSocket* adaptee;
public:
SocketAdapter(BritishSocket* adaptee) : adaptee(adaptee) {}
void power() override {
// Using adapter to call specific method of adaptee
adaptee->plugIn();
}
};
4.客户端代码
最后,我们可以使用适配器模式在客户端代码中测试适配器:
int main() {
BritishSocket* britishSocket = new BritishSocket();
EuropeanSocketInterface* adapter = new SocketAdapter(britishSocket);
// Plug in using European standard
adapter->power();
delete britishSocket;
delete adapter;
return 0;
}
解释
目标接口 EuropeanSocketInterface 定义了在欧洲使用的插座接口,其中 power() 方法是适配器需要实现的方法。
适配者 BritishSocket 是现有的英国插座,它有自己的 plugIn() 方法,与目标接口不兼容。
适配器 SocketAdapter 继承自 EuropeanSocketInterface,持有一个 BritishSocket 的实例,将 power() 方法委托给 BritishSocket 的 plugIn() 方法,从而实现了对欧洲插座接口的适配。
客户端代码 创建了一个英国插座对象和适配器对象,然后使用适配器对象调用了EuropeanSocketInterface 的 power() 方法,实际上调用了 BritishSocket 的 plugIn() 方法。
适配器模式使得不兼容的接口可以一起工作,提高了代码的复用性和灵活性。