假如需要去國外旅遊,遊玩,現在電子產品很豐富,但是每個電子產品都是需要電源來做驅動,手機,電腦,相機。 。 。但是又有一個很顯示的問題,電子產品是
很消耗電量的,電量沒有了,就需要充電,在我們國家,我們買的電子產品出場帶的電源充電器,通常都是220V的電壓,但是世界很大,每個國家的要求(規定)
又是不同的,例如美國就是120V
一、 類別適配器
#根據上面的UML圖,我們可以看出,需要一個美國電壓的介面UsaInterface,一個適配器類別
Adapter,一個中國電壓的介面
Chine,一個使用者
Computer
在這裡,中國電壓就是被適配器,美國電壓是最後的輸出(目標),就是是配置者
interface UsaInterface{ public function outPut5V();}class China{ private $voltage = 220; public function outPut220V() { return $this->voltage; }}class Adapter extends China implements UsaInterface{ public function outPut5V() { // TODO: Implement outPut5V() method. $chinaVoltage = $this->outPut220V(); return $chinaVoltage / 2 + 10 . "V"; }}class Computer{ public function index(UsaInterface $usa) { if ($usa->outPut5V() === "120V") { printf("可以在美国使用中国的电源插头给电脑充电了"); } else { printf("不可以在美国使用中国的电源插头给电脑充电了"); } }}class Client{ public function __construct() { $adapter = new Adapter(); $computer = new Computer(); $computer->index($adapter); }}
二、物件適配器模式
# #物件適配器其實就是在類別適配器的模式上做了一個調整,讓適配器類別Adapter不去繼承被適配器的類,而是讓它們組合在一起,這樣就可以增加了使用的靈活
度,也不會暴露被適配者的很多方法(使用關聯關係來代替繼承關係【合成復用原則】)。同時,沒有繼承就沒有辦法去覆蓋父類別的方法重寫了,也算是有好有壞吧。如下:
class Adapter implements UsaInterface{ protected $china; public function __construct(China $china) { $this->china = $china; } public function outPut5V() { // TODO: Implement outPut5V() method. $chinaVoltage = $this->china->outPut220V(); return $chinaVoltage / 2 + 10 . "V"; }}
三、介面適配器(預設適配器模式)
當不需要全部實作介面提供的方法時,可以先設計一個抽象類別實作接口,並為介面提供預設的空方法實現,那麼改抽象類別的子方法就可以有選擇的覆蓋父類別的某些方法來實現需求,(適用於一個介面不想使用所有的方法的情況)
相關學習推薦:
以上是一起看看PHP設計模式之轉接器模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!