PHP設計模式之介面卡模式
- 生活場景問題引入:
假如需要去國外旅遊,遊玩,現在電子產品很豐富,但是每個電子產品都是需要電源來做驅動,手機,電腦,相機。。。但是又有一個很顯示的問題,電子產品是
很消耗電量的,電量沒有了,就需要充電,在我們國家,我們買的電子產品出場帶的電源充電器,一般都是220V的電壓,但是世界很大,每個國家的要求(規定)
又是不同的,比如美國就是120V
- 原理:
將一個類的介面轉換為另外一種介面,讓原本介面不相容的類可以相容。
使用者呼叫介面卡轉化出來的目標介面方法,介面卡再去呼叫被適配者的相關介面方法
- 好處:
使用者是看不到被適配者,屬於解耦的操作
介面卡模式屬於結構型的設計模式
介面卡模式的三種實現方式:
5.1 類介面卡
根據上面的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);
}
}
5.2 物件介面卡模式
物件介面卡其實就是在類介面卡的模式上做了一個調整,讓介面卡類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";
}
}
5.3 介面介面卡(預設介面卡模式)
當不需要全部實現介面提供的方法時,可以先設計一個抽象類實現介面,併為介面提供預設的的空方法實現,那麼改抽象類的子方法就可以有選擇的覆蓋父類的某
些方法來實現需求,(適用於一個介面不想使用所有的方法的情況)
本作品採用《CC 協議》,轉載必須註明作者和本文連結
LIYi ---- github地址