网站建设主要问题及建议,域名一级和二级的区别,常用的oa系统办公软件,网站制作苏州企业一#xff0c;定义适配器模式#xff1a;结构型模式之一#xff0c;适配器提供客户类需要的接口#xff0c;适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时#xff0c;在适配器类的内部将调用适配者类的方法#x…一定义适配器模式结构型模式之一适配器提供客户类需要的接口适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时在适配器类的内部将调用适配者类的方法而这个过程对客户类是透明的客户类并不直接访问适配者类。因此适配器可以使由于接口不兼容而不能交互的类可以一起工作。适配器模式分为两种类适配器适配器和适配者是继承关系对象适配器适配器和适配者是关联关系二类图三成员职责抽象目标角色目标抽象类定义客户所需接口可以是一个抽象类或接口也可以是具体类。适配者角色适配器可以调用另一个接口作为一个转换器对Adaptee和Target进行适配适配器类是适配器模式的核心在类适配器中它通过继承Target和Adaptee使二者产生联系在对象适配器中它通过继承Target并关联一个Adaptee对象(设置为私有成员)使二者产生联系。适配器角色适配者即被适配的角色它定义了一个已经存在的接口这个接口需要适配适配者类一般是一个具体类包含了客户希望使用的业务方法。四实现我们给出以下场景现在有两种规格的插座中式规格插座和英式规格插座我们现在不改变英国插座的基础使英国可以转化为中国插座的规格英国插座抽象目标类Targetclass uksoket_target
{
public:virtual void ukplug(){cout 英国插座英式规格 endl;}
};中国插座适配者类Adapteeclass chsoket_adaptee //适配者
{
public:void chplug(){cout 中式规格 endl;}
};类适配器英式插座适配器适配器类Adapterclass uksocket_adapter : public uksoket_target,public chsocket_adaptee
{
public:void ukplug() override{cout 英国插座;chplug();}
};测试方法与主函数void test()
{uksoket_target* uk1 new uksoket_target();uksoket_target* uk2 new uksocket_adapter();uk1-ukplug();uk2-ukplug();delete uk1;uk1 nullptr;delete uk2;uk2 nullptr;
}int main()
{test();return 0;
}对象适配器英国适配器适配器类Adapterclass uksocket_adapter : public uksoket_target
{
private:chsocket_adaptee* ch;
public:void ukplug() override{cout 英国插座;ch-chplug();}
};测试方法与主函数void test()
{uksoket_target* uk1 new uksoket_target();uksoket_target* uk2 new uksocket_adapter();uk1-ukplug();uk2-ukplug();delete uk1;uk1 nullptr;delete uk2;uk2 nullptr;
}int main()
{test();return 0;
}五优缺点优点将目标类和适配器类解耦。通过引入一个适配器类来重用现有的适配者类而无须修改原有的代码。增加了类的透明性和复用性将具体的实现封装在适配器类中对于客户端类来说是透明的而且提高了适配器的复用性。灵活性和扩展性都非常好符合开闭原则缺点过多地使用适配器会让系统非常零乱不易整体进行把握。比如明明看到调用的是 A 接口其实内部被适配成了 B 接口的实现一个系统如果太多出现这种情况无异于一场灾难。因此如果不是很有必要可以不使用适配器而是直接对系统进行重构。六适用场景当想使用一个已存在的类而它的接口不符合需求时。你想创建一个可复用的类该类可以与其他不相关的类或不可预见的类协同工作。