一天一个设计模式(6)——适配器模式

适配器模式

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four

应用场景

适配器模式是为了解决现有项目的问题,扩展现有项目的功能或者将既有的功能添加到项目中而出现的。适配器模式不会应用于一个新项目的详细设计中。

例1:现有项目需要进行功能的扩充。

例2:从第三方下载的扩展功能需要添加到项目中。

实例

实际上适配器模式包括类适配器和对象适配器。但由于很多语言都不支持多继承,所以我们通常说的适配器模式指的就是对象适配器。

例子如下:电脑有USB接口,手机的SD卡想要插到电脑上使用,需要使用读卡器。读卡器实际上就充当了适配器的角色。

<?php

/**
 * 电脑上的USB接口,可以直接插上USB设备使用
 * Interface UsbInterface
 */
interface UsbInterface
{
    public function addHardware($type, $name);
}

/**
 * 支持SD卡的接口
 * Interface SDInterface
 */
interface SDInterface
{
    public function addSDCard($name);
}

/**
 * 实现SD接口的类
 * Class SD
 */
class SD implements SDInterface
{
    public function addSDCard($name)
    {
        echo 'Add a new SD hardware:' . $name;
    }
}

/**
 * 适配器,将SD接口添加到适配器中,同时实现USB接口
 * Class InterfaceAdapter
 */
class InterfaceAdapter implements UsbInterface
{
    /**
     * @var SDInterface
     */
    private $sd;

    public function __construct()
    {
        $this->sd = new SD();
    }

    public function addHardware($type, $name)
    {
        if ($type === 'SD') {
            $this->sd->addSDCard($name);
        }
    }
}

/**
 * 实现USB接口的类,可以理解成具体的USB插槽
 * Class USB
 */
class USB implements UsbInterface
{
    public function addHardware($type, $name)
    {
        if ($type === 'SD') {
            $adapter = new InterfaceAdapter();
            $adapter->addHardware($type, $name);
        } else if ($type === 'USB') {
            echo 'Add a new USB hardware:' . $name;
        } else {
            echo 'Invalid Hardware!';
        }
    }
}

//插入新设备
$usb = new USB();
$usb->addHardware('USB', 'U盘');
$usb->addHardware('SD', 'SD卡');

有的同学可能会说要不要这么麻烦啊,直接在USB类里面实现SD接口不就完了?

因为这个例子比较简单,SD接口只有一个方法。在实际应用中,SD接口可能会有很多的实现类,需要适配器去区分采用哪一个类来进行工作,所以才会专门创建一个适配器类。

posted @ 2017-04-26 10:19  Bin_x  阅读(107)  评论(0编辑  收藏  举报