PHP設計模式之外觀模式(Facade)瞭解下
阿新 • • 發佈:2018-12-12
這個外觀模式,就是通過在必需的邏輯和方法的集合前建立簡單的外觀介面,並且還會隱藏了呼叫物件的複雜性,它和建造者模式非常相似,建造者模式一般是簡化物件的呼叫的複雜性,但是外觀模式一般是簡化含有很多邏輯步驟和方法呼叫的複雜性。
來看下例項,先來描述下:
- 設計一個User類,裡面有getUser獲取使用者資訊介面
- 在使用getUser這個介面的時候,需要設定使用者的使用者名稱和使用者年齡
- 所以在正常情況下,呼叫getUser介面,需要先例項化User類,然後設定使用者資訊,最後才呼叫getUser方法,這個過程是複雜的,如果使用者資訊非常多的話,或者不斷變化的話,呼叫使用者資訊類將是維護成本很大的事情,比如,隨著業務擴充套件又添加了使用者手機,住址,體重,婚否等資訊。
- 設計了一個UserFacade,裡面有一個靜態方法getUserCall,這個方法可以直接呼叫getUser函式。
來看下程式碼:
<?php //外觀模式,通過在必須的邏輯和方法的集合前建立簡單的外觀介面,外觀設計模式隱藏了來自呼叫物件的複雜性 class User { protected $userName; protected $userAge; public function setUserName($userName) { return $this->userName = $userName; } public function setUserAge($userAge) { return $this->userAge = $userAge; } public function getUser() { echo '使用者姓名:' . $this->userName . '; 使用者年齡:' . $this->userAge; } } //建立一個User 類呼叫介面,簡化獲取使用者getUser方法的呼叫 class UserFacade { public static function getUserCall($userInfo) { $User = new User; $User->setUserName($userInfo['username']); $User->setUserAge($userInfo['userAge']); return $User->getUser(); } } $userInfo = array('username' => 'initphp', 'userAge' => 12); UserFacade::getUserCall($userInfo); //只要一個函式就能將呼叫類簡化
上述例項是網上一個比較經典的案例,很容易理解。
這個外觀模式的有點如下:
(1)對於呼叫者來說,訪問程式碼變得簡潔、非常方便
(2)由於只在一個地方呼叫子系統,減少了出錯的可能
(3)Facade類還能使呼叫者避免不正確地使用內部方法,從而減少錯誤的發生
來看下結構圖:
還有兩張圖,大家一起看下吧:
最後咱們參考一個網上的例子,設計一個商場統一購買家電和傢俱的場景,如下:
//家電-冰箱 class BingXiang {/*{{{*/ public function buy() { echo "買冰箱\r\n"; } }/*}}}*/ //家電-洗衣機 class XiYiJi {/*{{{*/ public function buy() { echo "買洗衣機\r\n"; } }/*}}}*/ //傢俱-創 class Chuang {/*{{{*/ public function buy() { echo "買床\r\n"; } }/*}}}*/ //傢俱-衣櫃 class YiGui {/*{{{*/ public function buy() { echo "買衣櫃\r\n"; } }/*}}}*/ //商場(Facade) class ShangChang {/*{{{*/ public $bingXiang; public $xiYiJi; public $chuang; public $yiGui; public function __construct() { $this->bingXiang = new BingXiang(); $this->xiYiJi = new XiYiJi(); $this->chuang = new Chuang(); $this->yiGui = new YiGui(); } //家電 public function buyJiaDian() {/*{{{*/ $this->bingXiang->buy(); $this->xiYiJi->buy(); }/*}}}*/ //傢俱 public function buyJiaJu() {/*{{{*/ $this->chuang->buy(); $this->yiGui->buy(); }/*}}}*/ }/*}}}*/ class Client {/*{{{*/ public static function main($argv) { $shangChang = new ShangChang(); //買家電 $shangChang->buyJiaDian(); //買傢俱 $shangChang->buyJiaJu(); } }/*}}}*/ Client::main($argv); ?>
輸出結果大家可以自己手動試下。
好啦,本次記錄就到這裡了。
如果感覺不錯的話,請多多點贊支援哦。。。