定义:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作
一. 适配器模式的两种形式:适配器模式有类的适配器模式和对象的适配器模式两种
1. 类的Adapter模式结构图
编辑
图2 对象的Adapter模式结构图
编辑
二. 类的Adapter模式的结构
我们还是以汽车类型为例子说明Adapter模式。现在有这样一个场景:假设我们在软件开发中要使用一个不同的汽车工厂实现,该汽车工厂实现有BMW和BYD两种方式,它提供给我们的API接口是Drive()方法,使用方法如下:
car.Drive("BMW!");
当软件系统开发进行到一半时,要生产BYD的模式进行生产时,使用方法如下:
car.Drive("BYD!");
编辑
这时也许我们会想到修改现在的汽车生产工具的API接口,但是由于版权等原因我们不能够修改它的源代码,此时Adapter模式便可以派上用场了
编辑
实现代码如下:
public class BMWAdapter:BMWCar,ICarTarget { public void Drive() { Drive(); } } public class BYDCarAdapter:BYDCar,ICarTarget { public void Drive() { this.Drive(); } }
public class App { public static void Main() { ICarTarget car= new BMWCarAdapter(); car.Drive("BMW.."); ICarTarget car= new BYDCarAdapter(); car.Drive("BYD.."); } }
三. 对象的Adapter模式的结构
编辑
实现代码如下:
public class CarAdapter:ICarTarget { private CarAdaptee _adaptee; public CarAdapter(CarAdaptee adaptee) { this._adaptee = adaptee; } public void Write() { _adaptee.Drive(); } }
与类适配器相比较,可以看到最大的区别是适配器类的数量减少了,不再需要为每一种具体的方式来创建一个适配器类。同时可以看到,引入对象适配器后,适配器类不再依赖于具体的BMWCar类和BYDCar类,更好的实现了松耦合。
再看一下客户端程序的调用方法:
public class App { public static void Main() { ICarTarget car= new CarAdapter(new BMWCar()); car.Drive("BMW.."); ICarTarget car= new CarAdapter(new BYDCar()); car.Drive("BYD.."); } }
文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群
创作不易,如果觉得文章不错,可以点赞收藏评论
你的支持和鼓励是我创作的动力❗❗❗
官网:Doker 多克官网;官方旗舰店:Doker 多克官方旗舰店