美文网首页csharp今日看点程序员
新旧对接,『适配器模式』

新旧对接,『适配器模式』

作者: 圣杰 | 来源:发表于2016-12-21 20:35 被阅读201次

    目录:设计模式之小试牛刀
    源码路径:Github-Design Pattern


    定义(Adapter Pattern):

    将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

    类图:

    类适配器模式通用类图 对象适配器模式通用类图

    启示:

    随着互联网的发展,手机已成为人们连接互联网的主要工具。现在手机阵营主要可以分为IOS、Android。每年的android和ios都会推陈出新,推出屏幕更大、配置更高、续航更持久、价格更实惠的手机,以满足用户日益对手机的需求。拿笔者举例,从第一部索尼ST18i的安卓手机,到IPhone6Plus,到荣耀3C,再到现在用的小米5,也是用过四部智能机的人了。手机都还不错,唯一的问题就是续航,跟诺基亚功能机的时代相比,续航简直都是渣。这不,为了满足续航要求,想必大多数人都会和我一样,自备充电宝。充电宝好是好,但是当你包里带着kindle、iPad、手机时,你就会为带一坨舍不得剪理还乱的数据线而苦恼了。为什么呢,iPad是标准的lightning接口,kindle是USB-Micro接口,小米5是USB-TypeC接口。但有一共性,其中一端都是USB接口的,聪明的淘宝商家看到这一点就发明了三合一数据线,一下就解决了我的问题。

    三合一充电线

    图中红框圈中的部件其实就充当了适配器的角色。

    那这一场景用我们『适配器模式』怎样实现呢?

    代码:

    在未定义充电标准之前,各个厂家充电线的实现各不相同,但都可以为自家品牌设备充电。

        /// <summary>
        /// 原装数据线
        /// 未定义充电标准的充电方法
        /// </summary>
        public class USBLine
        {
            public void Charge()
            {
                Console.WriteLine("为设备充电!");
            }
        }
    

    随着电器设备越来越多,各家的充电设备不能通用,造成很多不便,为了共用,厂家联合推出标准充电接口。

        /// <summary>
        /// 充电线
        /// 最终要适配成的目标角色
        /// </summary>
        public interface IChargingLine
        {
            /// <summary>
            /// 充电方法
            /// </summary>
            void Charging();
        }
    

    USB-Micro实现标准接口。

        /// <summary>
        /// USB数据线(支持USB-Micro端口的设备)
        /// </summary>
        public class USBMicroLine : IChargingLine
        {
            public void Charging()
            {
                Console.WriteLine("为支持USB-Micro端口的设备充电!");
            }
        }
    

    现在手里有一个未实现充电标准的充电线,如何为小米5设备充电呢?(对象适配器)

        /// <summary>
        /// 小米5充电线适配器
        /// 对象适配器模式
        /// </summary>
        public class USBTypecLineAdapter: IChargingLine
        {
            private readonly USBLine _usbLine;
            public USBTypecLineAdapter(USBLine usbLine)
            {
                this._usbLine = usbLine;
            }
    
            public void Charging()
            {
                Console.WriteLine("对USB-TypeC端口的数据线进行适配!");
                this._usbLine.Charge();
            }
        }
    

    那如何为苹果设备适配呢?(类适配器)

        /// <summary>
        /// 苹果充电线适配器
        /// 类适配器模式
        /// </summary>
        public class USBlightingLineAdapter : USBLine, IChargingLine
        {
            public void Charging()
            {
                Console.WriteLine("对USB-Lighting端口的数据线进行适配!");
                base.Charge();
            }
        }
    

    来我们看看实际的运行效果,测试场景类

    class Program
        {
            static void Main(string[] args)
            {
                //在未定义充电标准之前,各个厂家充电线的实现各不相同,但都可以为自家品牌设备充电
                USBLine usbLine = new USBLine();
                usbLine.Charge();
    
                Console.WriteLine("-------------------");
                //随着电器设备越来越多,各家的充电设备不能通用,造成很多不便,为了共用,厂家联合推出标准充电接口。
    
                //USB-Micro实现标准接口。
                IChargingLine microLine = new USBMicroLine();
                microLine.Charging();
    
                Console.WriteLine("-------------------");
    
                //现在手里有一个未实现充电标准的充电线,通过适配器,为小米5设备充电
                Console.WriteLine("对象适配器模式:");
                IChargingLine typeCLineAdapter = new USBTypecLineAdapter(usbLine);
                typeCLineAdapter.Charging();
    
                Console.WriteLine("-------------------");
    
                //现在手里有一个未实现充电标准的充电线,通过适配器,为苹果设备充电
                Console.WriteLine("类适配器模式:");
                IChargingLine lightingLineAdapter = new USBlightingLineAdapter();
                lightingLineAdapter.Charging();
            }
        }
    
    运行结果

    总结:

    类适配器模式,通过多重继承对一个接口与另一个接口进行匹配。
    对象适配器模式,是通过对象组合来实现匹配。

    适配器是一种补偿模式,或者说是一种比较模式。主要用来处理接口不相容的问题。

    优缺点:

    优点

    • 可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”
    • 提高了类的复用度,源角色和目标角色在系统同时存在。
    • 灵活性好,当不需要适配器模式时,可以直接删除。

    缺点

    • 采用类适配模式,提高了类的耦合性。

    应用场景:

    • 你想使用一个已经存在的类,而它的接口不符合你的需求。
    • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
    • 你想使用一些已经存在的类,但是不可能对每一个都进行子类化匹配它们的接口。对象适配器可以适配它的父类的接口。

    相关文章

      本文标题:新旧对接,『适配器模式』

      本文链接:https://www.haomeiwen.com/subject/oogtvttx.html