1.定義
外觀模式提供統一的接口,用來訪問子系統中的一羣接口。外觀定義了一個高層接口,讓子系統更容易使用。
注:一個子系統可以創建多個外觀類
2.模式圖
3.外觀模式遵循的oo設計原則
最少知識原則:只和你的密友交談;也就是要減少對象之間的交互,只留下幾個“密友”。
這個原則可以避免太多的類耦合在一起,導致修改系統中一部分時會影響到其他部分,這樣這個系統需要花許多成本維護,也會因爲太複雜而不容易被瞭解。
4.案例
1) 背景描述
當你在家想看電影時,必須先執行以下的任務:
打開爆米花機
開始爆米花
將燈光調暗
放下屏幕
打開投影機
將投影機設置在寬屏模式
打開功放
將功放的輸入設置爲DVD
將功放設置爲環繞立體聲
將功放音量調到中
打開DVD播放器
開始播放DVD
2)看完電影后,還需要把一切都關掉,又要再一次去做這些動作?這個時候就需要使用到外觀模式了。
3)案例中的類關係圖
4)外觀類代碼實現,其他類省略。
public class HomeTheaterFacade {
Amplifier amp;
Tuner tuner;
CdPlayer cd;
Screen screen;
public HomeTheaterFacade(Amplifier amp,Tuner tuner,CdPlayer cd,Screen screen){
this.amp = amp;
this.tuner = tuner;
this.cd = cd;
this.screen = screen;
}
//其他方法
//將我們之前手動進行的每項任務以此處理,且每項任務都是委託子系統中相應的組件處理
public void watchMovie(){
proper.on();
proper.pop();
screen.down();
amp.on();
//...
}
//負責關閉一切
public void endMovie(){
proper.off();
screen.down();
amp.on();
//.....
}
}
5)測試類代碼
public class HomeTheaterFacadeTest {
public static void main(String[] args) {
//實例化子系統其他組件
HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp,tuner,dvd,cd,screen,popper);
homeTheater.watchMovie("Start to watch movie");
homeTheater.endMovie();
}
}
5.外觀模式的優點
1)簡化了接口,如果客戶需要底層功能,依然可以將系統完成的功能暴露出來
2)將客戶從組件的子系統中解耦