c++适配器模式

时间:2021-01-02 15:06:35

你想使用一个已经存在的类,而它的接口不符合你的需求。

创建一个类需要和其他类协同完成任务,需要一个适配器将其他类的方法都转接到适配器当中

什么是适配器模式:有一个目标客户类想适用已经存在类的接口,但是已存在类的接口不符合客户类的接口命名,那么可以实现一个适配器类来将客户类调用他的方法实际上是调用适配器类的方法来调用已经存在类的方法(适配器类的方法中会调用已存在类方法)

创建一个类需要和其他类协同完成任务,需要一个适配器将其他类的方法都转接到适配器当中

有两种方式实现适配器模式:对象适配器模式和类适配器模式

对象模式:对象适配器类中构造函数传入一个已存在类类对象,有一个私有变量为已存在类的对象,有一个方法会调用已存在类的方法。

main函数中会调用方式:  客户类对象= new 对象适配器类(已存在类对象)

            客户类对象->客户对象类中的方法()

c++适配器模式

c++适配器模式

理解
1.       Target是供Client调用的抽象基类。
2.       Adaptee是需要适配的类(适配者类)。Adaptee的方法(SpecificRequest)与Target的方法(Request)是不兼容的。
3.       Adapter是适配器类。完成对Target和Adaptee的接口适配工作。Adapter重新实现Request方法,内部隐藏了调用Adaptee不兼容方法(SpecificRequest)的细节。
4.       类适配器是通过继承类适配者类(Adaptee)实现的。类适配器实现客户类所需要的方法(SpecificRequest)。当客户对象调用适配器类(Adapter)方法的时候,适配器内部调用它所继承的适配者的方法。
5.       对象适配器包含一个适配器者的引用,与类适配器相同,对象适配器也实现了客户类需要的接口。当客户对象调用对象适配器的方法的时候,对象适配器调它所包含的适配器者实例的适当方法。对象组合方式,允许一个Adapter适配多个Adaptee。
 
要点
1.       适配器模式适用于:
你想使用一个已经存在的类,而它的接口不符合你的需求。
你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
(仅适用于对象适配器)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
2.       C++使用类适配器时,Adapter类使用public方式继承Target类,并使用private方式继承Adaptee类。这样,Adapter是Target子类型,但不是Adaptee子类型。如此这般,推荐使用对象适配器方式。
3.       适配器模式与桥接(Bridge)模式的区别。桥接模式的目的是将接口部分与实现分离,从而使它们能相对独立的改变;桥接是设计阶段行为。适配器模式是对已有接口的改变,使得功能相同但接口不兼容的类桥接在一起。

最后再解释一下为什么类适配器模式公有继承目标类,私有继承需要适配的类?

公有继承:目标类对象调用自己的接口的时候保证调用的适配器类中和它同名的接口,只有适配器类中的方法才会调用已存在类中的实现方法,如果是私有继承那么肯定会调用客户类自己的方法,不会调用适配器类的方法了

私有继承:为了保证掉用的方法肯定是需要适配类的方法,如果是公有继承可能会调用该适配类中和方法名相同的方法而没有调用需要适配类的方法导致错误。

这两个都牵扯到私有继承和公有继承的特性:

私有继承只继承基类的接口而没有继承实现,及子类调用继承的方法的时候会调用父类中的方法

公有继承会继承基类中的接口和实现

在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在C++中pure virtual function也可以提供默认实现,因此这是不纯正的接口继承,但是在Java中我们可以interface来获得真正的接口继承了。