引言:
在实际的开发过程中,由于应用环境的变化(例如使用语言的变化),我们需要的实现在新的环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象。那么如果将“将现存的对象”在新的环境中进行调用呢?解决这个问题的办法就是我们本文要介绍的适配器模式。
定义:
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作
适配器的实现例子:
在这里以生活中的一个例子来进行演示适配器模式的实现,具体场景是: 在生活中,我们买的电器插头是2个孔的,但是我们买的插座只有三个孔的,此时我们就希望电器的插头可以转换为三个孔的就好,这样我们就可以直接把它插在插座上,此时三个孔插头就是客户端期待的另一种接口,自然两个孔的插头就是现有的接口,适配器模式就是用来完成这种转换的
实例:
class Program { static void Main(string[] args) { //客户端通过适配器使用两个孔的插头 ThreeHole threehole = new PowerAdapter(); threehole.Request(); Console.ReadLine(); } } /// <summary> /// 三个孔的插头,也就是适配器中的角色 /// </summary> public class ThreeHole { // 客户端需要的方法 public virtual void Request() { } } /// <summary> /// 两个孔的插头 /// </summary> public class TwoHole { public void SpecificRequest() { Console.WriteLine("我是两个孔的插头"); } } /// <summary> /// 适配器类 /// </summary> public class PowerAdapter : ThreeHole { // 引用两个孔插头的实例,从而将客户端与TwoHole联系起来 public TwoHole twoholeAdaptee = new TwoHole(); /// <summary> /// 实现三个孔插头接口方法 /// </summary> public override void Request() { twoholeAdaptee.SpecificRequest(); } }
优点:
可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”
可以重新定义Adaptee(被适配的类)的部分行为,因为在类适配器模式中,Adapter是Adaptee的子类
仅仅引入一个对象,并不需要额外的字段来引用实例(这个即是优点也是缺点)。
缺点:
采用了 “多继承”的实现方式,带来了不良的高耦合。
感觉这个模式的灵活性不太好,稍微变化的需要,那么改许多的代码