PHP設(shè)計模式之適配器模式
- 生活場景問題引入:
假如需要去國外旅游,游玩,現(xiàn)在電子產(chǎn)品很豐富,但是每個電子產(chǎn)品都是需要電源來做驅(qū)動,手機,電腦,相機。。。但是又有一個很顯示的問題,電子產(chǎn)品是
很消耗電量的,電量沒有了,就需要充電,在我們國家,我們買的電子產(chǎn)品出場帶的電源充電器,一般都是220V的電壓,但是世界很大,每個國家的要求(規(guī)定)
又是不同的,比如美國就是120V
- 原理:
將一個類的接口轉(zhuǎn)換為另外一種接口,讓原本接口不兼容的類可以兼容。
用戶調(diào)用適配器轉(zhuǎn)化出來的目標接口方法,適配器再去調(diào)用被適配者的相關(guān)接口方法
- 好處:
用戶是看不到被適配者,屬于解耦的操作
-
適配器模式屬于結(jié)構(gòu)型的設(shè)計模式
-
適配器模式的三種實現(xiàn)方式:
一、 類適配器
根據(jù)上面的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); }}
二、對象適配器模式
對象適配器其實就是在類適配器的模式上做了一個調(diào)整,讓適配器類Adapter
不去繼承被適配者的類,而是讓它們組合在一起,這樣就可以增加了使用的靈活
度,也不會暴露被適配者的很多方法(使用關(guān)聯(lián)關(guān)系來代替繼承關(guān)系【合成復(fù)用原則】)。同時,沒有繼承就沒有辦法去覆蓋父類的方法重寫了,也算是有好有壞吧。如下:
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"; }}
三、接口適配器(缺省適配器模式)
當不需要全部實現(xiàn)接口提供的方法時,可以先設(shè)計一個抽象類實現(xiàn)接口,并為接口提供默認的的空方法實現(xiàn),那么改抽象類的子方法就可以有選擇的覆蓋父類的某
些方法來實現(xiàn)需求,(適用于一個接口不想使用所有的方法的情況)
相關(guān)學(xué)習(xí)推薦:PHP編程從入門到精通