設計模式之適配器模式–不兼容變兼容接口
適配器模式
可以增加接口的易用性,使得不兼容的接口變得兼容。
將一個接口轉換成另外的接口,使得原本不兼容的接口變得兼容。
爲什麼要使用適配器模式
比如你的接口設計存在缺點,不夠易用,不能複用但又希望複用的時候。
比如你要對接多個平臺的接口他們互不兼容的時候。
現實中也有很多適配器,比如安卓蘋果的轉換頭,比如usb到type-c的轉換頭,都是因爲兩邊的接口不同,不兼容所以需要一個適配器。
下面是一個手機類,現在需要充電,但是手機的充電需要typec接口。
/**
* 適配器模式
* 手機類
*/
class mobile {
/**
* 給手機充電操作
*/
public function charge(ITypec $typec) {
dump('使用typec接口給手機充電');
$typec->typec();
}
}
現在只有一個usb接口可以充電。
/**
* 適配器模式
* 需要適配的類
* usb接口
*/
class usb {
/**
* 接口
*/
public function usb() {
dump('電腦usb接口');
}
}
我們增加一個適配器,也就是typec轉usb的頭。
/**
* 適配器模式
* 適配器接口
* typec接口
*/
interface ITypec {
/**
* 接口
*/
public function typec();
}
/**
* 適配器模式
* 適配器類,typec轉換usb的適配器
* typec接口
*/
class typec implements ITypec {
private $usb;
function __construct() {
$this->usb = new usb;
}
/**
* 接口
*/
public function typec() {
dump('接口適配器');
$this->usb->usb();
}
}
我們的客戶端就可以使用這個適配器了。
$mobile = new mobile();
$mobile->charge(new typec);
這是對象適配器
,還有類適配器,類適配器的話需要繼承要適配的類。
/**
* 適配器模式
* 適配器類,typec轉換usb的適配器
* typec接口
*/
class typec extends usb implements ITypec {
//不再需要存儲對象,直接繼承了
/**
* 接口
*/
public function typec() {
dump('接口適配器');
//$this->usb->usb();
//這裏改成使用父類的usb方法。
parent::usb();
}
}
適配器和代理模式還有裝飾器模式的區別
這幾個設計模式其實都差不多,你也可以說使用了typec代理了usb。只是角度不同所以名字不同罷了。
- 代理模式 更注重代理,代理了原有類。
- 裝飾器模式 比代理模式更加靈活多樣。
- 適配器模式 更注重兼容性,爲了兼容別的類,而不是代理和裝飾功能。
雖然角度不同,但是我覺得核心都差不多。這幾個設計模式都是需要修改原有類的時候,沒有選擇修改,而是套了殼子,來擴展功能。這是一種好的思想,靈活運用思想更重要。
代碼放在了我的github上面。