06 02 2020

适配器模式

模式定义

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

适配器模式的优势

可以让任何两个没有关联的类一起运行。提高了类的复用。增加了类的透明度。灵活性好。

适配器模式的缺陷

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

代码示例

Adapter\PaperBookInterface.class.php
<?php
namespace Adapter;

/*
 * 纸质书
 */
interface PaperBookInterface
{
    // 打开书
    public function open();

    // 翻页
    public function turnPage();
}


Adapter\Book.class.php
<?php
namespace Adapter;

/*
 * 纸质书实现类
 */
class Book implements PaperBookInterface
{
    public function open()
    {
        echo "打开纸质书" . "\n";
    }

    public function turnPage()
    {
        echo "纸质书翻页" . "\n";
    }
}


Adapter\EBookInterface.class.php
<?php
namespace Adapter;

/*
 * 电子书接口
 */
interface EBookInterface
{
    // 电子书打开
    public function pressStart();

    // 电子书翻页
    public function pressNext();
}


Adapter\Kindle.class.php
<?php
namespace Adapter;

class Kindle implements EBookInterface
{
    public function pressStart()
    {
        echo "打开电子书" . "\n";
    }

    public function pressNext()
    {
        echo "电子书翻页" . "\n";
    }
}


Adapter\EBookAdapter.class.php
<?php
namespace Adapter;

/*
 * 电子书适配类
 */
class EBookAdapter implements PaperBookInterface
{
    protected $eBook;

    public function __construct($ebook)
    {
        $this->eBook = $ebook;
    }

    public function open()
    {
        $this->eBook->pressStart();
    }

    public function turnPage()
    {
        $this->eBook->pressNext();
    }
}


Adapter\AdapterTest.php
<?php
spl_autoload_register(function ($className){
    $className = str_replace("\\", "/", $className);
    include $className . ".class.php";
});

use Adapter\EBookAdapter;
use Adapter\Kindle;
use Adapter\Book;

$book = new Book();
$book->open();
$book->turnPage();

$adapter = new EBookAdapter(new Kindle());
$adapter->open();
$adapter->turnPage();


测试示例:

php Adapter/AdapterTest.php

输出:
打开纸质书
纸质书翻页
打开电子书
电子书翻页


总结

适配器的存在,就是为了将已存在的东西(接口)转换成适合我们需要、能被我们所利用的东西。在现实生活中,适配器更多的是作为一个中间层来实现这种转换作用。比如电源适配器,它是用于电流变换(整流)的设备。



代码地址:https://github.com/798256478/design-patterns/tree/master/Adapter