PHP設計模式之門面模式

PHP設計模式之門面模式

門面模式,也叫外觀模式。不論是門面仍是外觀,都是咱們對外的媒介,就好像咱們的臉面同樣。因此,這個模式最大的特色就是要表現的「好看」。怎麼說呢?一堆複雜的對象調用,本身都看蒙了,特別是對老系統進行升級維護的時候。用門面來把老系統的功能調用封裝起來,在外面看來就和新系統同樣,這就是門面模式的用途啦!php

Gof類圖及解釋

GoF定義:爲子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。git

GoF類圖github

門面模式

代碼實現設計模式

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();
複製代碼

客戶端的調用就很是簡單了,咱們不用知道具體調用了哪些子系統,只須要知道門面的這些方法幹什麼了就行啦!this

  • 門面模式就是這麼的簡單,並且只要是真實的在項目中作過開發的朋友必定在不知不覺中就已經使用過這個模式了
  • 當你須要爲一個複雜子系統提供一個簡單的接口時,門面模式就很是適用。同時,若是客戶程序與抽象類的實現部分之間存在着很大的依賴性時,也能夠引入門面模式來進行解耦,提升子系統的獨立性和可維護性。另外就是你須要構建一個層次結構的子系統時,門面能夠充當每層子系統的入口點
  • Laravel中的門面系統相信使用過框架的人必定都用過,好比:Cache::put()。在Laravel中,門面的實現使用了一個魔術方法__callStatic()。而後讓對象的方法能夠實現直接使用靜態方法來進行調用。是否是很神奇。有興趣的朋友能夠翻翻源碼,就在/Illuminate/Support/Facades/Facade.php中。
  • 劃重點:三層結構或者MVC也是門面模式的體現哦。上面說了,門面模式適合分層子系統的維護。而三層結構、MVC、MVP、MVVM這些貨,本質上都是爲了分層,而分層的目的,就是爲了下降系統的複雜性。

光賣咱們的手機可不行,向X米同樣作高科技的家電企業纔是咱們最終的目標。不過那麼多的家電產品咱們可生產不過來,因而,咱們決定作一個商城(Facade)讓一些質量很是好的商家加入咱們的陣營,將他們的產品(SubSystem)放到商城中一塊兒賣。固然,這些商品但是通過咱們慎重挑選的,絕對都是優品中的優品哦!!阿里雲

完整代碼:github.com/zhangyue050…spa

實例

這回咱們將短信的發送以發送的維度進行包裝,將不一樣的短信和推送運營商的接口包裝起來,在發送的時候只須要經過發送類就能夠控制用不一樣的第三方服務進行短信或推送的發送啦,想一想都很方便呢!設計

短信發送類圖

短信發送功能門面模式版

完整源碼:github.com/zhangyue050…

<?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();


複製代碼

說明

  • 依然仍是熟悉的配方熟悉的味道。在這裏,能夠想象咱們的第三方服務類都是較老的接口,或者已是很複雜的接口了。這時,使用外觀模式一來是能夠與新系統配合,二來也能下降複雜度
  • 可是要注意的,外觀類自己可能成爲複雜度的來源,不過幸虧咱們能夠聽從單一職責的原則,一個外觀類就作一件事就好啦

下期看點

外觀模式其實並無太多可說的,由於它確實很是簡單並且無處不在。不要被Laravel花哨的Facade類所欺騙,它並無那麼的複雜。下回咱們學習到的依然是一個很是簡單並且在不知不覺中就會用到的模式:模板方法模式

相關文章
相關標籤/搜索