1. 程式人生 > >PHP設計模式之外觀模式(Facade)瞭解下

PHP設計模式之外觀模式(Facade)瞭解下

這個外觀模式,就是通過在必需的邏輯和方法的集合前建立簡單的外觀介面,並且還會隱藏了呼叫物件的複雜性,它和建造者模式非常相似,建造者模式一般是簡化物件的呼叫的複雜性,但是外觀模式一般是簡化含有很多邏輯步驟和方法呼叫的複雜性。

來看下例項,先來描述下:

  • 設計一個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);
 
?>

輸出結果大家可以自己手動試下。

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。