28

7. 设计模式-适配器模式

 4 years ago
source link: https://segmentfault.com/a/1190000023812100
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

生活中的例子

6ZruUv.png!mobile

如上图所示,生活中适配器无处不在,如电源适配器,读卡器,甚至多转接头读卡器等,都是很常见的例子,它们的目的都是将原本不能一起工作的部件能够在一起工作。

在软件工程领域的适配器也是同样类似的作用。

定义

适配器模式是将一个类的接口转换成客户希望的另外一个接口,即将原本由于接口不兼容而不能一起工作的那些类可以一起工作。

示例

这里就以一个简单的读卡器的例子来加以说明。通常在我们使用SD卡存储文件时,会存在如下情况:

  1. 电脑只有USB接口,不能直接插入SD卡;
  2. 电脑和SD卡都是成型的产品,不可能改造电脑或者读卡器。

因此,我们需要在中间实现一个转换器,也就是读卡器。具体关系图如下:

JV3qYz3.png!mobile

不难发现,电脑( Computer )和读卡器( SdReader )都实现了USB接口( IUsb ),而读卡器又聚合了SD卡,也就是SD卡随时可以插到读卡器上。具体实现代码如下:

public interface IUsb
{
    void Request();
}

public class Sd
{
    public void ReadWrite()
    {
        Console.WriteLine("存取数据");
    }
}

public class Computer
{
    private IUsb _usb;

    public void SetUsb(IUsb usb)
    {
        _usb = usb;
    }

    public void ConnectUsb()
    {
        if (_usb != null)
        {
            _usb.Request();
        }
    }
}

public class SdReader : IUsb
{
    private Sd _sd;

    public SdReader(Sd sd)
    {
        _sd = sd;
    }

    public void Request()
    {
        _sd.ReadWrite();
    }
}

其中,USB接口( IUsb )、电脑( Computer )还有SD卡( Sd )都是不可变,而读卡器( SdReader )的目的就是为了让SD卡( Sd )能够适配USB接口( IUsb )而额外增加的部分。

UML类图

将上述类图进行简单的抽象就可以得到如下UML类图,,这就是适配器模式:

fuiemuJ.png!mobile

  • Target :目标接口,我们期望的接口
  • Adapter :适配器,将被适配者转换成我们期望的形式
  • Adaptee : 被适配者,原有的接口

优缺点

优点

  1. 可以让任何两个没有关联的类一起运行。
  2. 提高了类的复用。
  3. 通过引入一个适配器类来重用现有的类,而无须修改原有结构,遵守了开闭原则

缺点

过多地使用适配器,会让系统非常零乱,不易整体进行把握。

总结

适配器模式虽然可以让任何两个没有关联的类一起运行,但是却属于补偿机制,专门用来在系统后期扩展、修改时使用,属于迫不得已的做法。因此,适配器模式也不宜过度使用,如果可以的话,我们应该优先通过重构解决,即让被适配的两个类一开始就可以一起工作或许会更好。

源码链接

更多内容,欢迎关注公众号:

BRvQrmy.jpg!mobile


Recommend

  • 113

    Scala 与设计模式(五):Adapter 适配器模式 11月20日 | by Prefert...

  • 68

    适配器模式(Adapter)是23种设计模式之一。DP中是这么定义外观模式的:适配器模式将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以在一起工作。我们生活中就经常使用到适配器,适配器这个词最早应该...

  • 50
    • www.sunnyang.com 6 years ago
    • Cache

    Java设计模式-适配器模式

    适配器模式是23种设计模式中比较常用的模式之一,在创建型模式、结构性模式和行为型模式分类中,适配器模式归类为结构型模式。 将一个类的接口转换成客户希望的另外一个接口。 Adapter模式使得原本由于接口不兼容而不能一起工作...

  • 43
    • coderlengary.github.io 6 years ago
    • Cache

    设计模式之适配器模式

    适配器模式指的是将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。 适配器模式下有以下角色: Source:资源...

  • 37

    作者:Andrew Jaffee, 原文链接 ,原文日期:2018-09-04 译者: 郑一一 ;校...

  • 58
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    Python 设计模式-适配器模式

  • 53
    • www.tuicool.com 5 years ago
    • Cache

    Java设计模式——适配器模式

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mingyunxiaohai/article/details/91358243 适配器模式是将一个类的接口转换成开发者希望的另一个接口 下面参考Retrofit的...

  • 46
    • www.hi-roy.com 5 years ago
    • Cache

    设计模式-适配器模式

    适配器模式目的就是不改变原有系统的基础上保留其提供的服务,向调用者提供新的接口服务,使得原本由于接口不兼容而不能一起工作的类可以一起工作。(简单说就是增加兼容性,复用已经存在的功能) 笔记本电脑的电源变压器就是这个...

  • 20

    在实际生活中,也存在适配器的使用场景,比如:港式插头转换器、电源适配器和 USB 转接口。 而在软件工程中,适配器模式的作用是解决两个软件实体间的接口不兼容的问题。 使用适配器模式之后,原本由于接口不兼容而不能工作...

  • 8
    • jiajunhuang.com 4 years ago
    • Cache

    Go设计模式:适配器模式

    Go设计模式:适配器模式 我买过一个港版的手机,香港的插座和大陆不一样,电压也不一样,因此为了充电,我还买了一个转换头,这个转换头,就是起的 适配器的使用。 原本,大陆插座是两个孔的;而香港的是三个孔,也就是说我手机是没有办法充...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK