设计模式-适配器模式

生活中的例子

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

定义

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

示例

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

  1. 电脑只有USB接口,不能直接插入SD卡;

  2. 电脑和SD卡都是成型的产品,不可能改造电脑或者读卡器。

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

不难发现,电脑(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类图,,这就是适配器模式:

  • Target:目标接口,我们期望的接口

  • Adapter:适配器,将被适配者转换成我们期望的形式

  • Adaptee: 被适配者,原有的接口

优缺点

优点

  1. 可以让任何两个没有关联的类一起运行。

  2. 提高了类的复用。

  3. 通过引入一个适配器类来重用现有的类,而无须修改原有结构,遵守了开闭原则

缺点

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

总结

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

(0)

相关推荐

  • 相机照片直接传手机,iOS 9.2更新后iPhone支持Lightning读卡器

    iOS 9.2更新后,苹果Lightning转相机USB和读卡器都将全面支持iPhone设备,相机照片能够直接传手机. 早前苹果就发布了两款Lightning接口的转接线,支持转USB相机适配器与SD ...

  • 当你开心地抱回MacBook Pro后,这些USB-C配件也需要加入购物车

    全新MacBook Pro这次起步价达到万元以上,让不少苦等已久.想买的果粉们钱包大出血一次,但苹果激进地把新笔记本电脑机身的接口换成4个USB-C(USB Type-C)接口,所以要想用得舒服,下面 ...

  • PHP设计模式—适配器模式

    定义: 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 结构: Target:目标接口,定义与 ...

  • 结构型设计模式 -- 适配器模式

    一.小案例分析 1.功能需求: 以电源适配器为例. 一个人去外国旅游,住在外国某宾馆,恰好手机没电(手机是双孔插头),但外国宾馆只有三孔插座,宾馆一般不可能为了旅客,将三孔插座换成双孔插座,此时适配器 ...

  • 设计模式 | 适配器模式(adapter)

    定义: 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.   书中说到Gof的设计模式中,讲了两种类型的适配器模式: 1.类适配 ...

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

    适配器模式也叫做包装模式:就是把内部结构包装(适配)成用户期待的格式,使得可以兼容使用 通过继承方式使用适配器模式 /** * @author maikec * @date 2019/5/9 */pu ...

  • 设计模式(七)——适配器模式(SpringMVC框架分析)

    适配器模式1 现实生活中的适配器例子泰国插座用的是两孔的(欧标),可以买个多功能转换插头 (适配器) ,这样就可以使用了. 2 基本介绍1) 适配器模式(Adapter Pattern)将某个类的接口 ...

  • PHP设计模式之适配器模式

    PHP设计模式之适配器模式 这个模式一直以来都有一个很经典的例子,那就是插座!没错,当我们从国外买回来电器,或者旅游出差去国外的时候,经常会需要一个电源适配器,因为我国的电压标准是220伏,而其他国家 ...

  • [PHP小课堂]PHP设计模式之适配器模式

    [PHP小课堂]PHP设计模式之适配器模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式之适配器模式案例详解

    基本介绍 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作. 适配器模式属于结构性模式,主要分为三类:类适配器模式.对象适 ...

  • 每天学习一个设计模式(一):结构型之适配器模式

    一.基本概念 适配器模式是将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的的类的兼容性问题. 二.通俗解释 ADAPTER 适配器模式:在朋友聚会上碰到了一个美女Sar ...