资料摘自《Head First设计模式》
外观模式提供一个简化的接口使得子系统更易于使用。
生活范例:组建自己的家庭影院
通过一番研究,你组装了一套杀手级的系统,内含DVD播放器、投影机、自动屏幕、环绕立体声,甚至还有爆米花机。
你花了好几个星期布线、挂上投影机、连接所有的装置并进行微调。现在,你准备开始享受一部电影.....
挑选一部DVD影片,放松,准备开始感受电影的魔幻魅力。
哎呀!忘了一件事:想看电影,必须先执行一些任务:
1.打开爆米花机
2.开始爆米花
3.将灯光调暗
4.放下屏幕
5.打开投影机
6.将投影机的输入切换到DVD
7.将投影机设置在宽屏模式
8.打开功放
9.将功放的输入设置为DVD
10.将功放设置为环绕立体声
11.将苏州音量调到中(5)
12.打开DVD播放器
13.开始播放DVD
还不只这样....
看完电影后,你还要把一切关掉,怎么办?难道要反向地把这一切动作再进行一次?
怎么办?使用你的家庭影院变得如此复杂!让我们看看外观模式如何解决这团混乱,好让你轻易地享受电影.....
1.为家庭影院系统创建一个外观类HomeTheaterFacade,它对外暴露出几个简单的方法,例如watchMovie()
2.这个外观类将家庭影院的诸多组件视为一个子系统,通过调用这个子系统来实现watchMovie()
3.现在你的客户代码可以调用此家庭影院外观所提供的方法,而不必再调用这个子系统的方法。所以,想要看电影,我们只要调用watchMovie()就可以了。灯光、DVD播放器、投影机、功放、屏幕、爆米花,一口气全部搞定
4.外观只是提供你更直接的操作,并未将原来的子系统阻隔起来。如果你需要子系统类的更高层功能,还是可以使用原来的子系统
public class HomeTheaterFacade{
//所有子系统组件
Amplifier amp;
Tuner tuner;
DvdPlayer dvd;
CdPlayer cd;
Projector projector;
TheaterLights lights;
Screen screen;
PopcornPopper popper;
public HomeTheaterFacade(Amplifier amp,Tuner tuner,DvdPlayer dvd,CdPlayer cd,Projector projector,TheaterLights lights,Screen screen,PopcornPopper popper){
this.amp = amp;
this.tunner = tuner;
this.dvd = dvd;
this.cd = cd;
this.projector = projector;
this.screen = screen;
this.lights = lights;
this.popper = popper;
}
public void watchMovie(String movie){
System.out.println("Get ready to watch a movie...");
//播放电影的一系列操作
popper.on();
popper.pop();
lights.dim(10);
......
dvd.play(movie);
}
public void endMovie(){
System.out.println("Shutting movie theater down...");
//结尾电影的一系列操作
popper.off();
lights.on();
......
dvd.off();
}
}
public class HomeTheaterTestDrive{
public static void main(String [] args){
//首先实例化组件
......
//接着
HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp,tuner,dvd,cd,projector,screen,lights,popper);
homeTheater.watchMovie("Raiders of the Lost Ark"); //使用简化的接口开启电影
homeTheater.endMovie(); //使用简化的接口关闭电影
}
}
定义:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。