1.适配器模式介绍
适配器模式的作用是将一个类的接口,转换成客户端希望的另外一种接口,适配器作为原始接口(我们的类中本来具有的功能)和目标接口(客户端希望的功能)之间的桥梁。举个例子:我们知道安卓数据线是不能给苹果手机充电的,但是我们没有苹果数据线,所以只能使用安卓数据线给苹果手机充电,这时怎么解决呢?通过一个转换头就可以了,这个转换头就是一个适配器。在适配器模式中:安卓数据线是我们现有的类,充电是安卓数据线的功能,但是充电功能就是因为接口不兼容所以不适应新环境(给苹果手机充电),转换头作为苹果手机和安卓数据线之间的桥梁,让原有的充电功能使用于新环境(给苹果手机充电)。
适配器模式有两种类型:类适配器和对象适配器,类适配器通过多重继承实现接口的匹配,C#不支持多重继承,我们不考虑。我们主要介绍对象适配器。首先说明介绍适配器模式的三个角色:
Adaptee:初始角色,实现了我们想要使用的功能,但是接口不匹配
Target:目标角色,定义了客户端期望的接口
Adapter:适配器角色,实现了目标接口。实现目标接口的方法是:内部包含一个Adaptee的对象,通过这个对象调用Adaptee的原有方法实现目标接口。(注:这里说的是对象适配器)
下边我们就以安卓数据线给苹果手机充电为例,介绍适配器模式的用法,代码十分简单
三种角色:
/// <summary> /// 安卓数据线,adaptee角色 /// </summary> public class AndroidLine { public void AndroidCharge() { Console.WriteLine("安卓数据线充电...."); } } /// <summary> /// 苹果手机充电接口,目标接口 /// </summary> public interface IApplyCharge { void ApplyChange(); } /// <summary> /// 苹果适配器 适配器角色 /// </summary> public class ApplyAdapter : IApplyCharge { AndroidLine androidLine = new AndroidLine();//适配器内部包含一个Adaptee对象 public void ApplyChange() { androidLine.AndroidCharge();//客户端调用时,表面上是用的是ApplyChange方法,本质还是用的AndroidCharge方法 } }
客户端调用:
class Program { static void Main(string[] args) { //获取一个target的实例 IApplyCharge applyAdapter = new ApplyAdapter(); applyAdapter.ApplyChange();//表面上用的苹果充电方法ApplyChange,本质上还是用的安卓充电方法AndriodChange。 Console.ReadKey(); } }
运行程序如下:
2.小结
上边例子的类图:
适配器的使用场景:
系统想使用一个类,但是这个类的接口不符合系统的要求时使用适配器模式。
适配器模式的优点:
1.提高代码复用,复用了Adaptee中的方法
2.灵活性好,如没有关联的两个类A和类B,类A想借用类B的方法,可以在类A中添加一个类B的实例,然后调用类B实例的方法即可。
适配器模式的缺点:
1.过多使用适配器会让会同凌乱,如我们明明调用的是A接口的功能,但是却被适配成了B接口的功能。