目的
將某個類的介面轉換成另一個介面以兼容,配接器使得原來因為介面不同而無法一起使用的類可以一起作業,
配接器通過將原始介面進行轉換,給用戶提供一個兼容介面,
例子
客戶端資料庫配接器
使用多個不同的網路服務和配接器來規范資料使得出結果是相同的
UML 圖

★BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨?
代碼
- BookInterface.php
<?php
namespace DesignPatterns\Structural\Adapter;
interface BookInterface
{
public function turnPage();
public function open();
public function getPage(): int;
}
- Book.php
<?php
namespace DesignPatterns\Structural\Adapter;
class Book implements BookInterface
{
/**
* @var int
*/
private $page;
public function open()
{
$this->page = 1;
}
public function turnPage()
{
$this->page++;
}
public function getPage(): int
{
return $this->page;
}
}
- EBookAdapter.php
<?php
namespace DesignPatterns\Structural\Adapter;
/**
* 這里是一個配接器. 注意他實作了 BookInterface,
* 因此你不必去更改客戶端代碼當使用 Book
*/
class EBookAdapter implements BookInterface
{
/**
* @var EBookInterface
*/
protected $eBook;
/**
* @param EBookInterface $eBook
*/
public function __construct(EBookInterface $eBook)
{
$this->eBook = $eBook;
}
/**
* 這個類使介面進行適當的轉換.
*/
public function open()
{
$this->eBook->unlock();
}
public function turnPage()
{
$this->eBook->pressNext();
}
/**
* 注意這里配接器的行為: EBookInterface::getPage() 將回傳兩個整型,除了 BookInterface
* 僅支持獲得當前頁,所以我們這里適配這個行為
*
* @return int
*/
public function getPage(): int
{
return $this->eBook->getPage()[0];
}
}
- EBookInterface.php
<?php
namespace DesignPatterns\Structural\Adapter;
interface EBookInterface
{
public function unlock();
public function pressNext();
/**
* 回傳當前頁和總頁數,像 [10, 100] 是總頁數100中的第10頁,
*
* @return int[]
*/
public function getPage(): array;
}
- Kindle.php
<?php
namespace DesignPatterns\Structural\Adapter;
/**
* 這里是適配過的類. 在生產代碼中, 這可能是來自另一個包的類,一些供應商提供的代碼,
* 注意它使用了另一種命名方案并用另一種方式實作了類似的操作
*/
class Kindle implements EBookInterface
{
/**
* @var int
*/
private $page = 1;
/**
* @var int
*/
private $totalPages = 100;
public function pressNext()
{
$this->page++;
}
public function unlock()
{
}
/**
* 回傳當前頁和總頁數,像 [10, 100] 是總頁數100中的第10頁,
*
* @return int[]
*/
public function getPage(): array
{
return [$this->page, $this->totalPages];
}
}
測驗
- Tests/AdapterTest.php
<?php
namespace DesignPatterns\Structural\Adapter\Tests;
use DesignPatterns\Structural\Adapter\Book;
use DesignPatterns\Structural\Adapter\EBookAdapter;
use DesignPatterns\Structural\Adapter\Kindle;
use PHPUnit\Framework\TestCase;
class AdapterTest extends TestCase
{
public function testCanTurnPageOnBook()
{
$book = new Book();
$book->open();
$book->turnPage();
$this->assertEquals(2, $book->getPage());
}
public function testCanTurnPageOnKindleLikeInANormalBook()
{
$kindle = new Kindle();
$book = new EBookAdapter($kindle);
$book->open();
$book->turnPage();
$this->assertEquals(2, $book->getPage());
}
}
PHP 互聯網架構師成長之路*「設計模式」終極指南
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)
面試10家公司,識訓9個offer,2020年PHP 面試問題
★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術咨詢和指導,歡迎加入我們的群啊,暗號:phpzh(群號碼856460874),
2020年最新PHP進階教程,全系列!?
內容不錯的話希望大家支持鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什么問題 建議 想看的內容可以在評論提出
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/39708.html
標籤:PHP
上一篇:推薦幾個學習編程的網站
