1. 定義
外部與一個(gè)子系統(tǒng)的通信必須通過(guò)一個(gè)統(tǒng)一的外觀對(duì)象進(jìn)行,為子系統(tǒng)中的一組接口提供一個(gè)一致的界面劲藐,外觀模式定義了一個(gè)高層接口牵辣,這個(gè)接口使得這一子系統(tǒng)更加容易使用。
2. 作用
為了實(shí)現(xiàn)客戶類和子系統(tǒng)的解耦跛璧,降低系統(tǒng)的使用復(fù)雜度。比如說(shuō)新啼,我們晚上下班回家后追城,要打開(kāi)電燈、空調(diào)燥撞、電視座柱,如果能有個(gè)控制器迷帜,實(shí)現(xiàn)一鍵打開(kāi)這些電器的功能就好了。
3. 結(jié)構(gòu)
外觀模式包含如下角色:
- Facade: 外觀角色
- SubSystem:子系統(tǒng)角色
4. 實(shí)現(xiàn)
- 子系統(tǒng)角色色洞,就是上面提到的電燈戏锹、空調(diào)、電視火诸,都可以被打開(kāi)和關(guān)閉锦针。
public class LightSystem {
public void turnOn() {
System.out.println("Turn on the light");
}
public void turnOff() {
System.out.println("Turn off the light");
}
}
public class TelevisionSystem {
public void turnOn() {
System.out.println("Turn on the tv");
}
public void turnOff() {
System.out.println("Turn off the tv");
}
}
public class AirConditionSystem {
public void turnOn() {
System.out.println("Turn on the air-condition");
}
public void turnOff() {
System.out.println("Turn off the air-condition");
}
}
- 外觀角色,控制器置蜀,把各種電器的開(kāi)閉都封裝在這里奈搜,對(duì)外只提供一鍵操作的接口。
public class FacadeController {
private LightSystem lightSystem;
private TelevisionSystem televisionSystem;
private AirConditionSystem airConditionSystm;
public FacadeController() {
lightSystem = new LightSystem();
televisionSystem = new TelevisionSystem();
airConditionSystm = new AirConditionSystem();
}
public void onKeyTurnOn() {
lightSystem.turnOn();
televisionSystem.turnOn();
airConditionSystm.turnOn();
}
public void onKeyTurnOff() {
lightSystem.turnOff();
televisionSystem.turnOff();
airConditionSystm.turnOff();
}
}
- 客戶類盯荤,使用控制器一鍵操作開(kāi)關(guān)馋吗,省時(shí)又省力。
public class FacadeTest {
public static void main(String[] args){
System.out.println("-------- Turn on ----------");
FacadeController facadeController = new FacadeController();
facadeController.onKeyTurnOn();
System.out.println("-------- Turn off ----------");
facadeController.onKeyTurnOff();
}
}
5. 優(yōu)缺點(diǎn)
1. 優(yōu)點(diǎn):
對(duì)客戶屏蔽子系統(tǒng)組件秋秤,減少了客戶處理的對(duì)象數(shù)目并使得子系統(tǒng)使用起來(lái)更加容易宏粤。它實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,并降低了大型軟件系統(tǒng)中的編譯依賴性灼卢,簡(jiǎn)化了系統(tǒng)在不同平臺(tái)之間的移植過(guò)程商架。
2. 缺點(diǎn):
不能很好地限制客戶使用子系統(tǒng)類,而且在不引入抽象外觀類的情況下芥玉,增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了「開(kāi)閉原則」备图。
3. 使用場(chǎng)景:
要為一個(gè)復(fù)雜子系統(tǒng)提供一個(gè)簡(jiǎn)單接口灿巧;客戶程序與多個(gè)子系統(tǒng)之間存在很大的依賴性;在層次化結(jié)構(gòu)中揽涮,需要定義系統(tǒng)中每一層的入口抠藕,使得層與層之間不直接產(chǎn)生聯(lián)系。
參考文章: