設(shè)計模式——外觀模式(Facade)

外觀模式(Facade),為子系統(tǒng)中的一組接口提供一個一致的界面,F(xiàn)acade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。

適用性:

當你要為一個復雜子系統(tǒng)提供簡單接口時,子系統(tǒng)往往因為不斷演化而變得越來越復雜。大多數(shù)模式使用時都會產(chǎn)生更多更小的類。

這使得子系統(tǒng)更具可重用性,也更容易對子系統(tǒng)進行定制,但這也給那些不需要定制子系統(tǒng)的用戶帶來一些使用上的困難。

Facade可以提供一個簡單的缺省視圖,這一視圖對大多數(shù)用戶來說已經(jīng)足夠,而那些需要更多的可定制性的用戶可以越過Facade層。

客戶程序與抽象類的實現(xiàn)部分之間存在著很大的依賴性。引入Facade將這個子系統(tǒng)與客戶以及其它子系統(tǒng)分離,可以提高子系統(tǒng)的獨立性和可移植性。

當你需要構(gòu)建一個層次結(jié)構(gòu)的子系統(tǒng)時,使用外觀模式定義子系統(tǒng)中每層的入口點。如果子系統(tǒng)之間是相互依賴的,你可以讓它們僅通過Facade進行通訊,從而簡化了它們之間的依賴關(guān)系。

角色分析:

1、外觀角色(Facade):此角色封裝一個高層接口,將客戶端的請求代理給適當?shù)淖酉到y(tǒng)對象,是門面模式的核心接口。

2、子系統(tǒng)角色(SubSystem):實現(xiàn)子系統(tǒng)的具體功能,處理FacadeCompany對象指派的任務(wù)。子系統(tǒng)沒有FacadeCompany的任何消息,沒有對FacadeCompany對象的引用。

優(yōu)點

1、對客戶屏蔽子系統(tǒng)組件,減少了客戶處理的對象數(shù)目,并使得子系統(tǒng)使用起來更加容易。通過引入外觀模式,客戶代碼將變得很簡單,與之關(guān)聯(lián)的對象也很少。

2、實現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,這使得子系統(tǒng)的組件變化不會影響到調(diào)它的客戶類,只需要調(diào)整外觀類即可。

3、降低了大型軟件系統(tǒng)的編譯依賴性,并簡化了系統(tǒng)在不同平臺之間的移植過程,因為編譯一個子系統(tǒng)一般不需要編譯所有其他的子系統(tǒng)。一個子系統(tǒng)的修改對其他子系統(tǒng)沒有任何影響,而且子系統(tǒng)內(nèi)部變化也不會影響到外觀對象。

4、只是提供了一個訪問子系統(tǒng)的統(tǒng)一入口,并不影響用戶直接使用子系統(tǒng)類。

缺點

1、不能很好地限制客戶使用子系統(tǒng)類,如果對客戶訪問子系統(tǒng)類做太多的限制則減少了可變性和靈活性。

2、在不引起抽象外觀類的情況下,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。

例:

class Sub_system_one {

???? public function method_one(){

???????? echo "subsystem one method one<br/>";

???? }

}

class Sub_system_two {

???? public function method_two(){

???????? echo "subsystem one method two<br/>";

???? }

}

class Sub_system_three {

???? public function method_three(){

???????? echo "subsystem one method three<br/>";

???? }

}

class Sub_system_four {

???? public function method_four(){

???????? echo "subsystem one method four<br/>";

???? }

}

class Facade {

???? private $_one;

???? private $_two;

???? private $_three;

???? private $_four;

???? public function __construct() {

???????? $this->_one = new Sub_system_one();

???????? $this->_two = new Sub_system_two();

???????? $this->_three = new Sub_system_three();

???????? $this->_four = new Sub_system_four();

???? }

???? public function method_A() {

???????? echo "method group A<br/>";

???????? $this->_one->method_one();

???????? $this->_two->method_two();

???????? $this->_four->method_four();

???? }

???? public function method_B() {

???????? echo "method group B<br/>";

???????? $this->_two->method_two();

???????? $this->_three->method_three();

???? }

}

$facade = new Facade();

$facade->method_A();

$facade->method_B();

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 核心思想是分割不同的層級,降低耦合。 代碼示例 運行結(jié)果 MethodAMethod OneMethod TwoM...
    Mitchell閱讀 425評論 0 0
  • -哥們約女友一起去看電影,早早地就在樓下等她,等了2個多小時女友才姍姍來遲,哥們生氣的說道:你怎么這么慢啊,女友不...
    肥羊并不肥閱讀 158評論 0 0
  • 這是趙云瀾和沈巍過上了沒羞沒臊的小日子之后的第一個七夕。 七月底,趁著沈老師上個研究課題結(jié)束,趙云瀾便哄了他去海邊...
    魚丸粗面的日記閱讀 589評論 0 0
  • 上一章 目錄 下一章 第十六章 受傷的蛇姐姐 紅點跟翠芽的一聲驚叫,讓大肚螞蟻覺得他們兩個有點大驚小怪,跟...
    繭破閱讀 407評論 0 2

友情鏈接更多精彩內(nèi)容