Java 杂谈

二十三种设计模式之外观模式

2018-08-19  本文已影响2人  呆某人

外观模式是我在工作之中首次用到的一种设计模式,当时我正在接入公司内部的用户体系,将每一个需要调用的用户接口都封装成了一个独立的方法,在我封装好之后准备使用的时候发现这些接口是有调用顺序的,而且我并不希望像这种调用顺序内部细节被暴露出来,因为我只想调用一个简单的接口,传入一个令牌,然后得到自己的用户实体类,将复杂的调用隐藏起来,降低复杂度。

于是我想起来我之前学过的外观模式,它会将一个或者数个类的复杂的一切隐藏在背后,只显露出一个感觉美好的外国

接下来举个栗子,在忙碌了一周之后,我们回到家中,想要看一部电影,那么我需要在看电影前做一些准备

打开爆米花机
开始爆米花
将灯光调暗
放下屏幕
打开投影机
将投影机的输入切换到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机、屏幕、灯、爆米花机

再定义家庭影院类,由家庭影院类中提供两个宏命令公共方法,看电影和停止看电影,这两个方法中集成了其它类中的方法,以一定的顺序执行方法,向外界提供了简单易用的接口,降低了接口使用的复杂性。

上一篇 下一篇

猜你喜欢

热点阅读