你想使用一个已经存在的类,而它的接口不符合你的需求。
创建一个类需要和其他类协同完成任务,需要一个适配器将其他类的方法都转接到适配器当中
什么是适配器模式:有一个目标客户类想适用已经存在类的接口,但是已存在类的接口不符合客户类的接口命名,那么可以实现一个适配器类来将客户类调用他的方法实际上是调用适配器类的方法来调用已经存在类的方法(适配器类的方法中会调用已存在类方法)
创建一个类需要和其他类协同完成任务,需要一个适配器将其他类的方法都转接到适配器当中
有两种方式实现适配器模式:对象适配器模式和类适配器模式
对象模式:对象适配器类中构造函数传入一个已存在类类对象,有一个私有变量为已存在类的对象,有一个方法会调用已存在类的方法。
main函数中会调用方式: 客户类对象= new 对象适配器类(已存在类对象)
客户类对象->客户对象类中的方法()
最后再解释一下为什么类适配器模式公有继承目标类,私有继承需要适配的类?
公有继承:目标类对象调用自己的接口的时候保证调用的适配器类中和它同名的接口,只有适配器类中的方法才会调用已存在类中的实现方法,如果是私有继承那么肯定会调用客户类自己的方法,不会调用适配器类的方法了
私有继承:为了保证掉用的方法肯定是需要适配类的方法,如果是公有继承可能会调用该适配类中和方法名相同的方法而没有调用需要适配类的方法导致错误。
这两个都牵扯到私有继承和公有继承的特性:
私有继承只继承基类的接口而没有继承实现,及子类调用继承的方法的时候会调用父类中的方法
公有继承会继承基类中的接口和实现
在Adapter模式的两种模式中,有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。在C++中的public继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作,又可以获得父类的接口实现。当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过private继承获得实现继承的效果(private继承后,父类中的接口都变为private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果,但是在C++中pure virtual function也可以提供默认实现,因此这是不纯正的接口继承,但是在Java中我们可以interface来获得真正的接口继承了。