门面模式,也叫外观模式。不论是门面还是外观,都是咱们对外的媒介,就如同咱们的脸面一样。所以,这个模式最大的特点就是要体现的“难看”。怎么说呢?一堆简单的对象调用,本人都看蒙了,特地是对老零碎进行降级保护的时候。用门面来把老零碎的性能调用封装起来,在里面看来就和新零碎一样,这就是门面模式的用处啦!
Gof 类图及解释
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();
客户端的调用就非常简单了,咱们不必晓得具体调用了哪些子系统,只须要晓得门面的这些办法干什么了就行啦!
- 门面模式就是这么的简略,而且只有是实在的在我的项目中做过开发的敌人肯定在人不知; 鬼不觉中就曾经应用过这个模式了
- 当你须要为一个简单子系统提供一个简略的接口时,门面模式就十分实用。同时,如果客户程序与抽象类的实现局部之间存在着很大的依赖性时,也能够引入门面模式来进行解耦,进步子系统的独立性和可维护性。另外就是你须要构建一个层次结构的子系统时,门面能够充当每层子系统的入口点
- Laravel 中的门面零碎置信应用过框架的人肯定都用过,比方:Cache::put()。在 Laravel 中,门面的实现应用了一个魔术办法__callStatic()。而后让对象的办法能够实现间接应用静态方法来进行调用。是不是很神奇。有趣味的敌人能够翻翻源码,就在 /Illuminate/Support/Facades/Facade.php 中。
- 划重点:三层构造或者 MVC 也是门面模式的体现哦。下面说了,门面模式适宜分层子系统的保护。而三层构造、MVC、MVP、MVVM 这些货,实质上都是为了分层,而分层的目标,就是为了升高零碎的复杂性。
光卖咱们的手机可不行,向 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();
阐明
- 仍然还是相熟的配方相熟的滋味。在这里,能够设想咱们的第三方服务类都是较老的接口,或者曾经是很简单的接口了。这时,应用外观模式一来是能够与新零碎配合,二来也能升高复杂度
- 然而要留神的,外观类自身可能成为复杂度的起源,不过幸好咱们能够听从繁多职责的准则,一个外观类就做一件事就好啦
下期看点
外观模式其实并没有太多可说的,因为它的确非常简单而且无处不在。不要被 Laravel 花哨的 Facade 类所坑骗,它并没有那么的简单。下回咱们学习到的仍然是一个非常简单而且在人不知; 鬼不觉中就会用到的模式: 模板办法模式
各自媒体平台均可搜寻【硬核项目经理】