門面模式,也叫外觀模式。不論是門面仍是外觀,都是咱們對外的媒介,就好像咱們的臉面同樣。因此,這個模式最大的特色就是要表現的「好看」。怎麼說呢?一堆複雜的對象調用,本身都看蒙了,特別是對老系統進行升級維護的時候。用門面來把老系統的功能調用封裝起來,在外面看來就和新系統同樣,這就是門面模式的用途啦!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類所欺騙,它並無那麼的複雜。下回咱們學習到的依然是一個很是簡單並且在不知不覺中就會用到的模式:模板方法模式