美文网首页Java 杂谈
二十三种设计模式之外观模式

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

作者: 呆某人 | 来源:发表于2018-08-19 21:40 被阅读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机、屏幕、灯、爆米花机

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

    相关文章

      网友评论

        本文标题:二十三种设计模式之外观模式

        本文链接:https://www.haomeiwen.com/subject/amjhiftx.html