外观模式是我在工作之中首次用到的一种设计模式,当时我正在接入公司内部的用户体系,将每一个需要调用的用户接口都封装成了一个独立的方法,在我封装好之后准备使用的时候发现这些接口是有调用顺序的,而且我并不希望像这种调用顺序内部细节被暴露出来,因为我只想调用一个简单的接口,传入一个令牌,然后得到自己的用户实体类,将复杂的调用隐藏起来,降低复杂度。
于是我想起来我之前学过的外观模式,它会将一个或者数个类的复杂的一切隐藏在背后,只显露出一个感觉美好的外国
接下来举个栗子,在忙碌了一周之后,我们回到家中,想要看一部电影,那么我需要在看电影前做一些准备
打开爆米花机
开始爆米花
将灯光调暗
放下屏幕
打开投影机
将投影机的输入切换到DVD
将投影机设置在宽屏模式
打开功放
将功放的输入设置为DVD
将功放设置为环绕立体声
将功放音量调到中(5)
打开DVD播放器
开始播放DVD
为了看个电影,要做这么多操作,虽然有点累但是接下来你就可以舒舒服服的靠在少发上看电影了。
过了两个小时,你看完了电影,准备去睡觉了,还要把所有的东西都关掉,这又是比较麻烦的事情。
但是,如果有一个开关,你只需要按一个按键,它就会自动将所有的准备工作做好了,或者关闭所有东西,你会不会感觉到很幸福,因为它很简单,直接将你所需要的东西给你了,相当于一个宏控制按钮,当然你也可以自己去做其中的一部分操作。
接下来上代码
public class DvdPlayer {
public void on(){
System.out.println("打开dvd");
}
public void play(String movie){
System.out.println("播放电影:"+movie);
}
public void off(){
System.out.println("关闭dvd");
}
}
public class Lights {
public void dim(){
System.out.println("将灯光调暗");
}
public void on(){
System.out.println("将灯光打开");
}
}
public class PopcornPopper {
public void on(){
System.out.println("打开爆米花机");
}
public void pop(){
System.out.println("开始爆米花");
}
public void off(){
System.out.println("关掉爆米花机");
}
}
public class Screen {
public void down(){
System.out.println("将屏幕放下");
}
public void up(){
System.out.println("将屏幕生升起");
}
}
public class HomeTheaterFacade {
private DvdPlayer dvd;
private Lights lights;
private Screen screen;
private PopcornPopper popper;
public HomeTheaterFacade(DvdPlayer dvd,Lights lights,Screen screen,PopcornPopper popper){
this.dvd = dvd;
this.lights = lights;
this.screen = screen;
this.popper = popper;
}
public void watchMovie(){
System.out.println("准备好开始看电影...");
popper.on();
popper.pop();
lights.dim();
screen.down();
dvd.on();
dvd.play("星球大战");
}
public void endMovie(){
System.out.println("关掉所有的开关...");
popper.off();
lights.on();
screen.up();
dvd.off();
}
public DvdPlayer getDvd() {
return dvd;
}
public void setDvd(DvdPlayer dvd) {
this.dvd = dvd;
}
public Lights getLights() {
return lights;
}
public void setLights(Lights lights) {
this.lights = lights;
}
public Screen getScreen() {
return screen;
}
public void setScreen(Screen screen) {
this.screen = screen;
}
public PopcornPopper getPopper() {
return popper;
}
public void setPopper(PopcornPopper popper) {
this.popper = popper;
}
}
public class ExteriorTest {
public static void main(String[] args) {
DvdPlayer dvd = new DvdPlayer();
Lights lights = new Lights();
PopcornPopper popper = new PopcornPopper();
Screen screen = new Screen();
HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(dvd, lights, screen, popper);
homeTheaterFacade.watchMovie();
homeTheaterFacade.endMovie();
}
}
运行结果
20180812134739668.png
首先定义四个类:dvd机、屏幕、灯、爆米花机
再定义家庭影院类,由家庭影院类中提供两个宏命令公共方法,看电影和停止看电影,这两个方法中集成了其它类中的方法,以一定的顺序执行方法,向外界提供了简单易用的接口,降低了接口使用的复杂性。
网友评论