簡介: 門面模式又稱之為外觀模式,屬於結構型的設計模式。 用於為子系統中的一組介面提供一致的調用方案。門面模式定義了一個高層介面,引入門面角色之後,只需要直接與門面角色交互,降低了系統的耦合度。 適用場景: 最經典的Laravel的Facade,當使用一些庫的時候,不需要瞭解底層系統如何實現,只需要 ...
簡介:
門面模式又稱之為外觀模式,屬於結構型的設計模式。
用於為子系統中的一組介面提供一致的調用方案。門面模式定義了一個高層介面,引入門面角色之後,只需要直接與門面角色交互,降低了系統的耦合度。
適用場景:
- 最經典的Laravel的Facade,當使用一些庫的時候,不需要瞭解底層系統如何實現,只需要知道如何使用門面調用即可。
- 為一些複雜的子系統提供一個簡單對外開放的調用方案。
優點:
- 對客戶端,屏蔽了子系統的實現邏輯,只留出可供使用的方法,讓開發人員很方便的看出來子系統可供調用的功能。
- 實現了子系統與調用端的松耦合關係。
- 擴展性很強,子類系統不受限制。
缺點:
隔絕了子系統的具體實現代碼,增加代碼溯源的難度。
代碼:
//註:這裡的門面寫法和Laravel中的不一樣,Laravel的門面是基於門面模式提供了一套強大且優雅的模塊子系統解決方案,而此處的門面只是一種實現門面思想的示例。
class Facade {
private $pc;
private $mobile;
public function __construct(Mobile $mobile, PC $pc) {
$this->mobile = $mobile;
$this->pc = $pc;
}
public function turnOn() {
$this->mobile->turnOn();
$this->pc->turnOn();
}
public function turnOff() {
$this->pc->turnOff();
$this->mobile->turnOff();
}
}
//子系統介面
interface PC {
public function turnOn();
public function turnOff();
}
//子系統介面
interface Mobile {
public function turnOn();
public function turnOff();
}
//子系統實現
class ASUS implements PC {
public function turnOn() {
echo '華碩電腦開機' . PHP_EOL;
}
public function turnOff() {
echo '華碩電腦關機' . PHP_EOL;
}
}
//子系統實現
class Vivo implements Mobile {
public function turnOn() {
echo 'Vivo手機開機' . PHP_EOL;
}
public function turnOff() {
echo 'Vivo手機關機' . PHP_EOL;
}
}
//調用端==========================================
$facade = new Facade(new Vivo(), new ASUS());
$facade->turnOn();
$facade->turnOff();