您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“PHP中的門面模式是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
門面模式,也叫外觀模式。不管是門面還是外觀,都是我們對外的媒介,就好像我們的臉面一樣。所以,這個模式最大的特點就是要表現(xiàn)的“好看”。怎么說呢?一堆復(fù)雜的對象調(diào)用,自己都看蒙了,特別是對老系統(tǒng)進行升級維護的時候。用門面來把老系統(tǒng)的功能調(diào)用封裝起來,在外面看來就和新系統(tǒng)一樣,這就是門面模式的用途啦!
GoF定義:為子系統(tǒng)中的一組接口提供一個一致的界面,F(xiàn)acade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
GoF類圖
代碼實現(xiàn)
class SubSystemOne { public function MethodOne() { echo '子系統(tǒng)方法一', PHP_EOL; } } class SubSystemTwo { public function MethodTwo() { echo '子系統(tǒng)方法二', PHP_EOL; } } class SubSystemThree { public function MethodThree() { echo '子系統(tǒng)方法三', PHP_EOL; } } class SubSystemFour { public function MethodFour() { echo '子系統(tǒng)方法四', PHP_EOL; } }
定義四個或者N多個子系統(tǒng),這個沒什么好說的吧,可以想象是很多子系統(tǒng),而且他們之間并不一定和這四個子系統(tǒng)一樣的相似,有可能是千差萬別的。
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(); } }
通過門面類將這些子系統(tǒng)包裝起來,對外提供的只是門面新定義的方法。
$facade = new Facade(); $facade->MethodA(); $facade->MethodB();
客戶端的調(diào)用就非常簡單了,我們不用知道具體調(diào)用了哪些子系統(tǒng),只需要知道門面的這些方法干什么了就行啦!
門面模式就是這么的簡單,而且只要是真實的在項目中做過開發(fā)的朋友一定在不知不覺中就已經(jīng)使用過這個模式了
當你需要為一個復(fù)雜子系統(tǒng)提供一個簡單的接口時,門面模式就非常適用。同時,如果客戶程序與抽象類的實現(xiàn)部分之間存在著很大的依賴性時,也可以引入門面模式來進行解耦,提高子系統(tǒng)的獨立性和可維護性。另外就是你需要構(gòu)建一個層次結(jié)構(gòu)的子系統(tǒng)時,門面可以充當每層子系統(tǒng)的入口點
Laravel中的門面系統(tǒng)相信使用過框架的人一定都用過,比如:Cache::put()。在Laravel中,門面的實現(xiàn)使用了一個魔術(shù)方法__callStatic()。然后讓對象的方法可以實現(xiàn)直接使用靜態(tài)方法來進行調(diào)用。是不是很神奇。有興趣的朋友可以翻翻源碼,就在/Illuminate/Support/Facades/Facade.php中。
劃重點:三層結(jié)構(gòu)或者MVC也是門面模式的體現(xiàn)哦。上面說了,門面模式適合分層子系統(tǒng)的維護。而三層結(jié)構(gòu)、MVC、MVP、MVVM這些貨,本質(zhì)上都是為了分層,而分層的目的,就是為了降低系統(tǒng)的復(fù)雜性。
光賣我們的手機可不行,向X米一樣做高科技的家電企業(yè)才是我們最終的目標。不過那么多的家電產(chǎn)品我們可生產(chǎn)不過來,于是,我們決定做一個商城(Facade)讓一些質(zhì)量非常好的商家加入我們的陣營,將他們的產(chǎn)品(SubSystem)放到商城中一起賣。當然,這些商品可是經(jīng)過我們慎重挑選的,絕對都是優(yōu)品中的優(yōu)品哦??!
完整代碼:https://github.com/zhangyue0503/designpatterns-php/blob/master/19.facade/source/facade.php
這回我們將短信的發(fā)送以發(fā)送的維度進行包裝,將不同的短信和推送運營商的接口包裝起來,在發(fā)送的時候只需要通過發(fā)送類就可以控制用不同的第三方服務(wù)進行短信或推送的發(fā)送啦,想想都很方便呢!
短信發(fā)送類圖
完整源碼: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 '發(fā)送阿里云短信!', PHP_EOL; } public function Push() { echo '推送阿里云通知!', PHP_EOL; } } class JiGuangService { public function Send() { echo '發(fā)送極光短信!', PHP_EOL; } public function Push() { echo '推送極光通知!', PHP_EOL; } } $send = new Send(); $send->PushAndSendAliYun(); $send->PushAndSendJiGuang();
說明
依然還是熟悉的配方熟悉的味道。在這里,可以想象我們的第三方服務(wù)類都是較老的接口,或者已經(jīng)是很復(fù)雜的接口了。這時,使用外觀模式一來是可以與新系統(tǒng)配合,二來也能降低復(fù)雜度
但是要注意的,外觀類本身可能成為復(fù)雜度的來源,不過幸好我們可以遵從單一職責(zé)的原則,一個外觀類就做一件事就好啦
“PHP中的門面模式是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。