GoF类图
门面模式
代码实现

classSubSystemOne{publicfunctionMethodOne(){echo'子系统方法一',PHP_EOL;}}classSubSystemTwo{publicfunctionMethodTwo(){echo'子系统方法二',PHP_EOL;}}classSubSystemThree{publicfunctionMethodThree(){echo'子系统方法三',PHP_EOL;}}classSubSystemFour{publicfunctionMethodFour(){echo'子系统方法四',PHP_EOL;}}
定义四个或者N多个子系统,这个没什么好说的吧,可以想象是很多子系统,而且他们之间并不一定和这四个子系统一样的相似,有可能是千差万别的。
classFacade{private$subStytemOne;private$subStytemTwo;private$subStytemThree;private$subStytemFour;publicfunction__construct(){$this->subSystemOne=newSubSystemOne();$this->subSystemTwo=newSubSystemTwo();$this->subSystemThree=newSubSystemThree();$this->subSystemFour=newSubSystemFour();}publicfunctionMethodA(){$this->subSystemOne->MethodOne();$this->subSystemTwo->MethodTwo();}publicfunctionMethodB(){$this->subSystemOne->MethodOne();$this->subSystemTwo->MethodTwo();$this->subSystemThree->MethodThree();$this->subSystemFour->MethodFour();}}
通过门面类将这些子系统包装起来,对外供应的只是门面新定义的方法。
$facade=newFacade();$facade->MethodA();$facade->MethodB();
客户真个调用就非常大略了,我们不用知道详细调用了哪些子系统,只须要知道门面的这些方法干什么了就行啦!
光卖我们的手机可弗成,向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
<?phpclassSend{private$aliYunService;private$jiGuangService;private$message;private$push;publicfunction__construct(){$this->aliYunService=newAliYunService();$this->jiGuangService=newJiGuangService();$this->message=newMessageInfo();$this->push=newPushInfo();}publicfunctionPushAndSendAliYun(){$this->message->Send($this->aliYunService);$this->push->Push($this->aliYunService);}publicfunctionPushAndSendJiGuang(){$this->message->Send($this->jiGuangService);$this->push->Push($this->jiGuangService);}}classMessageInfo{publicfunctionSend($service){$service->Send();}}classPushInfo{publicfunctionPush($service){$service->Push();}}classAliYunService{publicfunctionSend(){echo'发送阿里云短信!
',PHP_EOL;}publicfunctionPush(){echo'推送阿里云关照!
',PHP_EOL;}}classJiGuangService{publicfunctionSend(){echo'发送极光短信!
',PHP_EOL;}publicfunctionPush(){echo'推送极光关照!
',PHP_EOL;}}$send=newSend();$send->PushAndSendAliYun();$send->PushAndSendJiGuang();
解释
依然还是熟习的配方熟习的味道。在这里,可以想象我们的第三方做事类都是较老的接口,或者已经是很繁芜的接口了。这时,利用外不雅观模式一来是可以与新系统合营,二来也能降落繁芜度但是要把稳的,外不雅观类本身可能成为繁芜度的来源,不过幸好我们可以屈服单一职责的原则,一个外不雅观类就做一件事就好啦下期看点外不雅观模式实在并没有太多可说的,由于它确实非常大略而且无处不在。不要被Laravel花哨的Facade类所欺骗,它并没有那么的繁芜。下回我们学习到的依然是一个非常大略而且在不知不觉中就会用到的模式:模板方法模式