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

目录:设计模式之小试牛刀
源码路径: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();
        }
    }
运行结果

总结:

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

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

优缺点:

优点

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

缺点

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

应用场景:

  • 你想使用一个已经存在的类,而它的接口不符合你的需求。
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
  • 你想使用一些已经存在的类,但是不可能对每一个都进行子类化匹配它们的接口。对象适配器可以适配它的父类的接口。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容