外觀模式:降低客戶端與子系統(tǒng)的耦合度。
(1) Facade(外觀角色):在客戶端可以調(diào)用它的方法,在外觀角色中可以知道相關(guān)的(一個(gè)或者多個(gè))子系統(tǒng)的功能和責(zé)任;在正常情況下粹懒,它將所有從客戶端發(fā)來的請求委派到相應(yīng)的子系統(tǒng)去,傳遞給相應(yīng)的子系統(tǒng)對象處理顷级。
(2) SubSystem(子系統(tǒng)角色):在軟件系統(tǒng)中可以有一個(gè)或者多個(gè)子系統(tǒng)角色凫乖,每一個(gè)子系統(tǒng)可以不是一個(gè)單獨(dú)的類,而是一個(gè)類的集合,它實(shí)現(xiàn)子系統(tǒng)的功能帽芽;每一個(gè)子系統(tǒng)都可以被客戶端直接調(diào)用删掀,或者被外觀角色調(diào)用,它處理由外觀類傳過來的請求导街;子系統(tǒng)并不知道外觀的存在披泪,對于子系統(tǒng)而言,外觀角色僅僅是另外一個(gè)客戶端而已搬瑰。
例如:把大象裝進(jìn)冰箱這個(gè)腦筋急轉(zhuǎn)彎款票。這個(gè)動作被分解為三步:打開冰箱門,把大象放進(jìn)冰箱泽论,關(guān)上冰箱門艾少。
對于客戶端來說,只要把大象裝進(jìn)冰箱這個(gè)結(jié)果翼悴,不需要知道被分解為三步缚够,由3個(gè)子系統(tǒng)完成。
設(shè)計(jì)成外觀模式鹦赎。
代碼:
public class OpenDoor {
public void openDoor(){
System.out.println("open door");
}
}
public class PutElephantIntoFridge {
public void putElephant(){
System.out.println("Put Elephant Into Fridge ");
}
}
public class CloseDoor {
public void closeDoor(){
System.out.println("close door");
}
}
public class GetElephantFacade {
private CloseDoor close;
private OpenDoor open;
private PutElephantIntoFridge put;
public GetElephantFacade (){
close = new CloseDoor();
open = new OpenDoor();
put = new PutElephantIntoFridge();
}
public void? putElephant(){
open.openDoor();
put.putElephant();
close.closeDoor();
}
}
測試代碼:
GetElephantFacade ge = new GetElephantFacade();
ge.putElephant();
通過以上的代碼和分析谍椅,我們發(fā)現(xiàn),外觀模式钙姊,違背了開閉原則毯辅,即如果增加一個(gè)動作,需要修改現(xiàn)有的代碼煞额。
為了解決這個(gè)問題思恐,需要設(shè)計(jì)一個(gè)抽象類或者接口,外觀類繼承或者實(shí)現(xiàn)這個(gè)抽象類或者接口膊毁,這樣一來胀莹,增加其他動作就可以放在新增外觀類中。