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