门面模式,也叫外观模式。不论是门面仍是外观,都是咱们对外的媒介,就好像咱们的脸面同样。因此,这个模式最大的特色就是要表现的“好看”。怎么说呢?一堆复杂的对象调用,本身都看蒙了,特别是对老系统进行升级维护的时候。用门面来把老系统的功能调用封装起来,在外面看来就和新系统同样,这就是门面模式的用途啦!php
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
光卖咱们的手机可不行,向X米同样作高科技的家电企业才是咱们最终的目标。不过那么多的家电产品咱们可生产不过来,因而,咱们决定作一个商城(Facade)让一些质量很是好的商家加入咱们的阵营,将他们的产品(SubSystem)放到商城中一块儿卖。固然,这些商品但是通过咱们慎重挑选的,绝对都是优品中的优品哦!!阿里云
完整代码:github.com/zhangyue050…spa
这回咱们将短信的发送以发送的维度进行包装,将不一样的短信和推送运营商的接口包装起来,在发送的时候只须要经过发送类就能够控制用不一样的第三方服务进行短信或推送的发送啦,想一想都很方便呢!设计
短信发送类图
<?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类所欺骗,它并无那么的复杂。下回咱们学习到的依然是一个很是简单并且在不知不觉中就会用到的模式:模板方法模式