设计模式-适配器模式

生活中的例子

如上图所示,生活中适配器无处不在,如电源适配器,读卡器,甚至多转接头读卡器等,都是很常见的例子,它们的目的都是将本来不能一块儿工做的部件可以在一块儿工做。
在软件工程领域的适配器也是一样相似的做用。git

定义

适配器模式是将一个类的接口转换成客户但愿的另一个接口,即将本来因为接口不兼容而不能一块儿工做的那些类能够一块儿工做。github

示例

这里就以一个简单的读卡器的例子来加以说明。一般在咱们使用SD卡存储文件时,会存在以下状况:code

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

所以,咱们须要在中间实现一个转换器,也就是读卡器。具体关系图以下:blog

不难发现,电脑(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)而额外增长的部分。get

UML类图

将上述类图进行简单的抽象就能够获得以下UML类图,,这就是适配器模式:源码

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

优缺点

优势

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

缺点

过多地使用适配器,会让系统很是零乱,不易总体进行把握。产品

总结

适配器模式虽然可让任何两个没有关联的类一块儿运行,可是却属于补偿机制,专门用来在系统后期扩展、修改时使用,属于无可奈何的作法。所以,适配器模式也不宜过分使用,若是能够的话,咱们应该优先经过重构解决,即让被适配的两个类一开始就能够一块儿工做或许会更好。it

源码连接class

相关文章
相关标签/搜索