外觀模式(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();