首页 > 代码库 > 设计模式之适配器模式
设计模式之适配器模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
组成:
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
适配器模式分为两种类型:类适配器模式和对象适配器模式
类适配器:
通过多重继承对一个接口与另一个接口进行匹配,存在一个适配器类继承自客户所请求的接口和实际接口
对象适配器:
通过组合关系满足用户期待接口,存在一个适配器类含有一个实际接口的实例
目标接口:
需要适配的类:
类适配器:
在Adapter类内,实现了Target接口Request方法,并继承自Adaptee,Adapter类的Request方法重新封装了Adaptee的SpecificRequest方法,实现了适配的目的。
对象适配器:
通过在Adapter类内部封装一个Adaptee对象,把源接口转换成目标接口。
客户端:
适用场景:
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
组成:
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
适配器模式分为两种类型:类适配器模式和对象适配器模式
类适配器:
通过多重继承对一个接口与另一个接口进行匹配,存在一个适配器类继承自客户所请求的接口和实际接口
对象适配器:
通过组合关系满足用户期待接口,存在一个适配器类含有一个实际接口的实例
目标接口:
class Target { public: virtual void Request(){}; };
需要适配的类:
class Adaptee { public: void SpecificRequest() { cout<<"SpecificRequest"<<endl; } };
类适配器:
class Adapter : public Adaptee, public Target//多重继承自目标接口和需要适配的类 { public: void Request() { this->SpecificRequest(); } };
在Adapter类内,实现了Target接口Request方法,并继承自Adaptee,Adapter类的Request方法重新封装了Adaptee的SpecificRequest方法,实现了适配的目的。
对象适配器:
class Adapter : public Target { private: Adaptee *adaptee=new Adaptee(); public: void Request() { adaptee->SpecificRequest();//含有一个实际接口的实例 } };
通过在Adapter类内部封装一个Adaptee对象,把源接口转换成目标接口。
客户端:
int main() { Target *target = new Adapter(); target->Request(); return 0; }
适用场景:
1.系统需要使用现有的类,而此类的接口不符合系统的需要。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。
3.(对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。