- 定義:
Facade(外觀)模式為子系統(tǒng)中的一組接口提供一個一致的界面,定義一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。 -
UML:
image.png - 模型:
家庭影院,包含DVD播放器,投影儀,自動屏幕,環(huán)繞立體聲,爆米花機等,這些社保都有開關設置功能。最后我們用遙控器控制各個社保的開關,實現(xiàn)播放家庭影院:
實現(xiàn)播放家庭影院步驟:
1開爆米花機
2.放下屏幕
3.開投影儀
4.開音響
5.開DVD,選dvd
6.去拿爆米花
7.調節(jié)燈光
總體來看我們想播放家庭影院需要很多的復雜的步驟,并且這些步驟都是固定的。而對于用戶并不關心這些步驟的操作過程,只要最后有爆米花,有的dvd看就行。外觀模式就是做這種事情的。我們通過外觀的包裝,使用戶只能看到外觀對象,而不會看到具體的細節(jié)對象,這樣無疑會降低應用程序的復雜度,并且提高了程序的可維護性。
image.png
public class DVDPlayer {
private static DVDPlayer instance = null;
private DVDPlayer() {}
public static DVDPlayer getInstance() {
if (instance == null) {
instance = new DVDPlayer();
}
return instance;
}
public void on() {
System.out.println("DVDPlayer On");
}
public void off() {
System.out.println("DVDPlayer Off");
}
public void play() {
System.out.println("DVDPlayer is playing");
}
public void pause() {
System.out.println("DVDPlayer pause");
}
public void setdvd() {
System.out.println("DVDPlayer is setting dvd");
}
}
//爆米花機
public class Popcorn {
private static Popcorn instance = null;
private Popcorn() {}
public static Popcorn getInstance() {
if (instance == null) {
instance = new Popcorn();
}
return instance;
}
public void on() {
System.out.println("Popcorn On");
}
public void off() {
System.out.println("Popcorn Off");
}
public void pop() {
System.out.println("Popcorn is popping");
}
}
//環(huán)繞立體聲
public class Stereo {
private static Stereo instance = null;
private int volume = 5;
private Stereo() {}
public static Stereo getInstance() {
if (instance == null) {
instance = new Stereo();
}
return instance;
}
public void on() {
System.out.println("Stereo On");
}
public void off() {
System.out.println("Stereo Off");
}
public void setVolume(int vol) {
volume = vol;
System.out.println("the volume of Stereo is set to " + volume);
}
public void addVolume() {
if (volume < 11) {
volume++;
setVolume(volume);
}
}
public void subVolume() {
if (volume > 0) {
volume--;
setVolume(volume);
}
}
}
//投影機
public class Projector {
private int size=5;
private static Projector instance = null;
private Projector() {}
public static Projector getInstance() {
if (instance == null) {
instance = new Projector();
}
return instance;
}
public void on() {
System.out.println("Projector On");
}
public void off() {
System.out.println("Projector Off");
}
public void focus() {
System.out.println("Popcorn is focus");
}
public void zoom(int size) {
this.size=size;
System.out.println("Popcorn zoom to"+size);
}
}
//屏幕
public class Screen {
private static Screen instance = null;
private Screen() {}
public static Screen getInstance() {
if (instance == null) {
instance = new Screen();
}
return instance;
}
public void up() {
System.out.println("Screen up");
}
public void down() {
System.out.println("Screen down");
}
}
//燈
public class TheaterLights {
private static TheaterLights instance = null;
private TheaterLights() { }
public static TheaterLights getInstance() {
if (instance == null) {
instance = new TheaterLights();
}
return instance;
}
public void on() {
System.out.println("TheaterLights On");
}
public void off() {
System.out.println("TheaterLights Off");
}
//調節(jié)亮度
public void dim(int d) {
System.out.println("TheaterLights dim to " + d + "%");
}
public void bright() {
dim(100);
System.out.println("TheaterLights bright");
}
}
//包裝的外觀類
public class HomeTheaterFacade {
private TheaterLights mTheaterLights;
private Popcorn mPopcorn;
private Stereo mStereo;
private Projector mProjector;
private Screen mScreen;
private DVDPlayer mDVDPlayer;
//注入各個設備對象
public HomeTheaterFacade() {
mTheaterLights = TheaterLights.getInstance();
mPopcorn = Popcorn.getInstance();
mStereo = Stereo.getInstance();
mProjector = Projector.getInstance();
mScreen = Screen.getInstance();
mDVDPlayer = DVDPlayer.getInstance();
}
//固定的準備流程
public void ready() {
mPopcorn.on();
mPopcorn.pop();
mScreen.down();
mProjector.on();
mStereo.on();
mDVDPlayer.on();
mDVDPlayer.setdvd();
mTheaterLights.dim(10);
}
//固定的關閉流程
public void end() {
mPopcorn.off();
mTheaterLights.bright();
mScreen.up();
mProjector.off();
mStereo.off();
mDVDPlayer.setdvd();
mDVDPlayer.off();
}
public void play() {
mDVDPlayer.play();
}
public void pause() {
mDVDPlayer.pause();
}
}
使用包裝的外觀對象操作家庭影院:
public class MainTest {
public static void main(String[] args) {
HomeTheaterFacade mHomeTheaterFacade=new HomeTheaterFacade();
mHomeTheaterFacade.ready();
mHomeTheaterFacade.play();
}
}
通過這樣的包裝,我們可以把外觀對象做成遙控器,這樣我們就能通過遙控器來實現(xiàn)家庭影院的控制。

