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