前言
俗話說得好,随着人類的進步,社會的發展(土土的國小生用語),家庭影院已經進入普通家庭。那麼如何建構一個集中管理的家庭影院軟體系統呢?注意家庭影院需要做很多有趣的事情哦,比如内含DVD播放器,投影儀,自動螢幕,環繞立體聲等。。。
當當當,外觀模式閃亮登場(QAQ)。。。
概述
定義
外觀模式(Facade Pattern)提供了一個統一的接口,用來通路子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。
外觀模式允許我們讓客戶和子系統之間避免緊耦合,而且遵循“最少知識”原則
”最少知識“原則:隻和你的密友談話。也就是說,當你正在設計一個系統,不管是任何對象,你都要注意它所互動的類有哪些,并注意它和這些類是如何互動的。
類圖
Facade:外觀角色
設計模式的實作
背景
背景就是前言中提到的,實作家庭影院。現在,我需要實作對投影儀,空調,螢幕和燈的控制。這裡我們隻實作對投影儀和螢幕的控制。
代碼實作
package Facade;
/**
* 子系統——投影儀
* Created by ChongLou on 2017/8/20.
*/
public class Projector {
public void on() {
System.out.println("打開了投影儀。。。");
}
public void off() {
System.out.println("關閉了投影儀");
}
}
package Facade;
/**
* 子系統——螢幕
* Created by ChongLou on 2017/8/20.
*/
public class Screen {
public void on() {
System.out.println("打開了螢幕");
}
public void off() {
System.out.println("關閉了螢幕");
}
}
package Facade;
/**
* 家庭影院外觀
* Created by ChongLou on 2017/8/20.
*/
public class HomeTheaterFacade {
Projector projector;
Screen screen;
public HomeTheaterFacade(Projector projector, Screen screen) {
this.projector = projector;
this.screen = screen;
}
public void on(){
projector.on();
screen.on();
}
public void off(){
screen.on();
projector.on();
}
}
package Facade;
/**
* 用戶端
* Created by ChongLou on 2017/8/20.
*/
public class Client {
public static void main(String[] args) {
Projector projector = new Projector();
Screen screen = new Screen();
HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(projector, screen);
homeTheaterFacade.on();
System.out.println("家庭影院已經打開");
homeTheaterFacade.off();
System.out.println("家庭影院已經關閉");
}
}
運作結果
總結
- 外觀将客戶從一個複雜的子系統中解耦。
- 實作一個外觀,需要将子系統組合禁外觀中,然後将工作委托給子系統執行。
- 擴充卡将一個對象包裝起來以改變其接口;裝飾者将一個對象包裝起來以增加新的行為和責任;而外觀将一群對象“包裝”起來以簡化其接口。