优点:
- 可以让两个不兼容的接口协同工作。
- 可以提高类的复用性。
- 可以增加类的透明性和可扩展性。
缺点:
- 适配器模式可能会增加系统的复杂性。
- 在使用适配器模式时,需要仔细设计适配器接口,以避免在未来修改适配器接口时带来的问题。
满足设计原理:
- 单一职责原则:适配器模式通过定义适配器类来实现单一职责原则。适配器类的唯一职责就是将一个接口转换为另一个接口。这样,当需要修改适配器类时,只需修改适配器类即可,而无需修改其他类。
- 开闭原则:适配器模式通过定义适配器接口来实现开闭原则。当需要添加新的适配器时,只需定义新的适配器类并实现适配器接口即可。这样,客户端代码无需修改,就可以使用新的适配器。
- 里氏替换原则:适配器模式通过定义适配器接口来实现里氏替换原则。客户端代码依赖于适配器接口,而不是具体的适配器类。这样,当需要更换适配器时,只需更换具体的适配器类即可,而无需修改客户端代码。
常用实例:
- 集成第三方库:适配器模式可以用于集成第三方库。例如,您可以定义一个适配器接口,用于将第三方库的接口转换为您的应用程序所需的接口。然后,您可以定义一个具体的适配器类,实现适配器接口并使用第三方库。这样,您的应用程序就可以使用第三方库,而无需修改现有代码。
- 封装遗留代码:适配器模式可以用于封装遗留代码。例如,您可以定义一个适配器接口,用于将遗留代码的接口转换为新代码所需的接口。然后,您可以定义一个具体的适配器类,实现适配器接口并使用遗留代码。这样,您就可以在新代码中使用遗留代码,而无需修改遗留代码。
- 适配不同的数据格式:适配器模式可以用于适配不同的数据格式。例如,您可以定义一个适配器接口,用于将一种数据格式转换为另一种数据格式。然后,您可以定义多个具体的适配器类,分别实现不同数据格式之间的转换。这样,您就可以在应用程序中使用不同的数据格式,而无需修改现有代码。
类图:
代码:
#include "iostream"
#include "string"
using namespace std;
class Target
{
public:
virtual ~Target(){};
virtual void Request()=0;
};
class Adaptee
{
public:
void SpecifiRequest()
{
cout<<"Called SpecificRequest()"<<endl;
}
};
class Adapter :public Target
{
private:
Adaptee*adaptee;
public:
Adapter(Adaptee* adaptee)
{
this->adaptee=adaptee;
}
void Request()
{
adaptee->SpecifiRequest();
}
};
int main()
{
Adaptee *adaptee=new Adaptee;
Adapter*adaoter=new Adapter(adaptee);
adaoter->Request();
return 0;
}