PHP设计模式之门面模式

门面模式,也叫外观模式。不论是门面仍是外观,都是咱们对外的媒介,就好像咱们的脸面同样。因此,这个模式最大的特色就是要表现的“好看”。怎么说呢?一堆复杂的对象调用,本身都看蒙了,特别是对老系统进行升级维护的时候。用门面来把老系统的功能调用封装起来,在外面看来就和新系统同样,这就是门面模式的用途啦!php

Gof类图及解释

GoF定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。laravel

GoF类图git

门面模式

代码实现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();

客户端的调用就很是简单了,咱们不用知道具体调用了哪些子系统,只须要知道门面的这些方法干什么了就行啦!学习

  • 门面模式就是这么的简单,并且只要是真实的在项目中作过开发的朋友必定在不知不觉中就已经使用过这个模式了
  • 当你须要为一个复杂子系统提供一个简单的接口时,门面模式就很是适用。同时,若是客户程序与抽象类的实现部分之间存在着很大的依赖性时,也能够引入门面模式来进行解耦,提升子系统的独立性和可维护性。另外就是你须要构建一个层次结构的子系统时,门面能够充当每层子系统的入口点
  • Laravel中的门面系统相信使用过框架的人必定都用过,好比:Cache::put()。在Laravel中,门面的实现使用了一个魔术方法__callStatic()。而后让对象的方法能够实现直接使用静态方法来进行调用。是否是很神奇。有兴趣的朋友能够翻翻源码,就在/Illuminate/Support/Facades/Facade.php中。
  • 划重点:三层结构或者MVC也是门面模式的体现哦。上面说了,门面模式适合分层子系统的维护。而三层结构、MVC、MVP、MVVM这些货,本质上都是为了分层,而分层的目的,就是为了下降系统的复杂性。

光卖咱们的手机可不行,向X米同样作高科技的家电企业才是咱们最终的目标。不过那么多的家电产品咱们可生产不过来,因而,咱们决定作一个商城(Facade)让一些质量很是好的商家加入咱们的阵营,将他们的产品(SubSystem)放到商城中一块儿卖。固然,这些商品但是通过咱们慎重挑选的,绝对都是优品中的优品哦!!this

完整代码:https://github.com/zhangyue0503/designpatterns-php/blob/master/19.facade/source/facade.php阿里云

实例

这回咱们将短信的发送以发送的维度进行包装,将不一样的短信和推送运营商的接口包装起来,在发送的时候只须要经过发送类就能够控制用不一样的第三方服务进行短信或推送的发送啦,想一想都很方便呢!code

短信发送类图

短信发送功能门面模式版

完整源码: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();

说明

  • 依然仍是熟悉的配方熟悉的味道。在这里,能够想象咱们的第三方服务类都是较老的接口,或者已是很复杂的接口了。这时,使用外观模式一来是能够与新系统配合,二来也能下降复杂度
  • 可是要注意的,外观类自己可能成为复杂度的来源,不过幸亏咱们能够听从单一职责的原则,一个外观类就作一件事就好啦

下期看点

外观模式其实并无太多可说的,由于它确实很是简单并且无处不在。不要被Laravel花哨的Facade类所欺骗,它并无那么的复杂。下回咱们学习到的依然是一个很是简单并且在不知不觉中就会用到的模式:模板方法模式

关注公众号:【硬核项目经理】获取最新文章

添加微信/QQ好友:【xiaoyuezigonggong/149844827】免费得PHP、项目管理学习资料

知乎、公众号、抖音、头条搜索【硬核项目经理】

B站ID:482780532

相关文章
相关标签/搜索