在之前的文章《淺談PHP中的橋接模式》中我們介紹了PHP中的橋接模式,以下這篇文章帶大家了解一下PHP設計模式中的門面模式。
門面模式,也叫外觀模式。不管是門面還是外觀,都是我們對外的媒介,就好像我們的臉面一樣。所以,這個模式最大的特色就是要表現的「好看」。怎麼說呢?一堆複雜的物件調用,自己都看蒙了,特別是對舊系統進行升級維護的時候。用門面來把舊系統的功能呼叫封裝起來,在外面看來就跟新系統一樣,這就是門面模式的用途啦!
GoF定義:為子系統中的一組接口提供一個一致的介面,Facade模式定義了一個高層接口,這個接口使得這子系統更容易使用。
GoF類別圖
#程式碼實作
class SubSystemOne { public function MethodOne() { echo '子系统方法一', PHP_EOL; } } class SubSystemTwo { public function MethodTwo() { echo '子系统方法二', PHP_EOL; } } class SubSystemThree { public function MethodThree() { echo '子系统方法三', PHP_EOL; } } class SubSystemFour { public function MethodFour() { echo '子系统方法四', PHP_EOL; } }
定義四個或N多個子系統,這個沒什麼好說的吧,可以想像是很多子系統,而且他們之間並不一定和這四個子系統一樣的相似,有可能是千差萬別的。
class Facade { private $subStytemOne; private $subStytemTwo; private $subStytemThree; private $subStytemFour; public function __construct() { $this->subSystemOne = new SubSystemOne(); $this->subSystemTwo = new SubSystemTwo(); $this->subSystemThree = new SubSystemThree(); $this->subSystemFour = new SubSystemFour(); } public function MethodA() { $this->subSystemOne->MethodOne(); $this->subSystemTwo->MethodTwo(); } public function MethodB() { $this->subSystemOne->MethodOne(); $this->subSystemTwo->MethodTwo(); $this->subSystemThree->MethodThree(); $this->subSystemFour->MethodFour(); } }
透過門面類別將這些子系統包裝起來,對外提供的只是門面新定義的方法。
$facade = new Facade(); $facade->MethodA(); $facade->MethodB();
客戶端的呼叫就非常簡單了,我們不用知道具體呼叫了哪些子系統,只需要知道門面的這些方法幹什麼了就行啦!
光賣我們的手機可不行,向X米一樣做高科技的家電企業才是我們最終的目標。不過那麼多的家電產品我們可生產不過來,於是,我們決定做一個商城(Facade)讓一些質量非常好的商家加入我們的陣營,將他們的產品(SubSystem)放到商城中一起賣。當然,這些商品可是經過我們慎重挑選的,絕對都是優品中的優品哦! !
完整程式碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/19.facade/source/facade.php
這回我們將短信的發送以發送的維度進行包裝,將不同的短信和推送運營商的接口包裝起來,在發送的時候只需要通過發送類就可以控制用不同的第三方服務進行簡訊或推播的發送啦,想想都很方便呢!
簡訊發送類別圖
#完整原始碼:https://github.com/zhangyue0503/designpatterns-php /blob/master/19.facade/source/facade-push.php
<?php class Send { private $aliYunService; private $jiGuangService; private $message; private $push; public function __construct() { $this->aliYunService = new AliYunService(); $this->jiGuangService = new JiGuangService(); $this->message = new MessageInfo(); $this->push = new PushInfo(); } public function PushAndSendAliYun() { $this->message->Send($this->aliYunService); $this->push->Push($this->aliYunService); } public function PushAndSendJiGuang() { $this->message->Send($this->jiGuangService); $this->push->Push($this->jiGuangService); } } class MessageInfo { public function Send($service) { $service->Send(); } } class PushInfo { public function Push($service) { $service->Push(); } } class AliYunService { public function Send() { echo '发送阿里云短信!', PHP_EOL; } public function Push() { echo '推送阿里云通知!', PHP_EOL; } } class JiGuangService { public function Send() { echo '发送极光短信!', PHP_EOL; } public function Push() { echo '推送极光通知!', PHP_EOL; } } $send = new Send(); $send->PushAndSendAliYun(); $send->PushAndSendJiGuang();
說明
原文網址:https://juejin.cn/post/6844903988085653518
作者:硬核專案經理
推薦學習:《PHP影片教學》
以上是一文了解PHP中的門面模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!