C#设计模式(7)——适配器模式

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接口的功能。

 

posted @ 2018-11-24 16:22  捞月亮的猴子  阅读(831)  评论(0编辑  收藏  举报