设计模式:外观模式

  外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

  场景:有一个家庭影院,里面有爆米花机,投影,DVD机,音响等,然后等我们要开始享观赏电影的时候,我们不得不执行打开爆米花机,开始爆米,关闭爆米花机,关闭灯,放在投影....等等一系列操作,然后观赏完电影,还有在关闭这些东西,这多累人啊。这时候,我们就可以利用外观模式,提供一个合理的接口的外观类,让你只需一键完成一系列操作。下面我们看下代码的实现

  首先我们创建一系列子系统

//爆米花类
public class Popper {
    
    public void on(){
        System.out.println("打开爆米花机");
    }
    public void pop(){
        System.out.println("爆米花机开始爆米");
    }
    public void off(){
        System.out.println("关闭爆米花机");
    }
}

//电灯类
public class Light {
    
    public void on(){
        System.out.println("打开电灯");
    }
    public void off(){
        System.out.println("关闭电灯");
    }
}

//投影类
public class Projector {
    
    public void open(){
        System.out.println("打开投影");
    }
    
    public void close(){
        System.out.println("关闭投影");
    }
}

//音响类
public class Stereo {
    public void on(){
        System.out.println("打开音响");
    }
    
    public void off(){
        System.out.println("关闭音响");
    }
    
    public void setDVD(){
        System.out.println("设置DVD模式");
    }
    
    public void setSurroundSound(){
        System.out.println("设置四周环绕声音");
    }
}

//dvd类
public class Dvd {
    public void setDVD(String movie){
        System.out.println("放置DVD:" + movie);
    }
    
    public void play(){
        System.out.println("播放电影" );
    }
    
    public void off(){
        System.out.println("关闭DVD");
    }
    
    public void removeDVD(){
        System.out.println("取出影片");
    }
}

//屏幕类
public class Screen {
    
    public void up(){
        System.out.println("拉起屏幕");
    }
    
    public void down(){
        System.out.println("放下屏幕");
    }
}

  接着我们创建一个外观模式的接口

//设置一个接口HomeMovieFacade来连接客户和组件(音响、DVD)之间的操作
public class HomeMovieFacade {
    //创建组合
    Dvd dvd;
    Light light;
    Popper popper;
    Projector projector;
    Screen screen;
    Stereo stereo;
    
    //外观将子系统中每一个组件通过构造方法都引入进来赋给相应的值
    public HomeMovieFacade(Dvd dvd,Light light,Projector projector,
                           Popper popper,Screen screen,Stereo stereo){
        
        this.dvd = dvd;
        this.light = light;
        this.popper = popper;
        this.projector = projector;
        this.screen = screen;
        this.stereo = stereo;
    }
    
    //开始享受家庭影院,这方法将我们之前每次需要手动处理的任务都交给子系统处理了。
    public void watchMovie(String movie){
        System.out.println("准备开始看电影了!");
        popper.on();
        popper.pop();
        popper.off();
        light.off();
        screen.down();
        projector.open();
        stereo.on();
        stereo.setDVD();
        stereo.setSurroundSound();
        dvd.setDVD(movie);
        dvd.play();
    }
    
    
    //享受完关闭影院
    public void endMovie(){
        System.out.println("看完电影要收拾了!");
        light.on();
        screen.up();
        projector.close();
        stereo.off();
        dvd.off();
        dvd.removeDVD();
    }
}

  最后我们来进行测试,也就是客户类

public class Test {
    public static void main(String[] args) {
        //实例化各个组件
        Dvd dvd = new Dvd();
        Light light = new Light();
        Popper popper = new Popper();
        Projector projector = new Projector();
        Screen screen = new Screen();
        Stereo stereo = new Stereo();
        
        //实例化外观对象,只需利用外观对象的一个方法来进行一系列子系统的操作,不关心子系统的一系列操作
        HomeMovieFacade homeMovieFacade = new HomeMovieFacade(dvd, light, projector, popper, screen, stereo);
        homeMovieFacade.watchMovie("设计模式电影");
        System.out.println("------------");
        homeMovieFacade.endMovie();
        
    }
}

  下面是运行的结果

     

  好了,这就是一个简单的外观模式的使用范例了。最后说下装饰者、适配器、外观这三个模式的区别。装饰者意图是不改变接口,但加入责任,适配器是将一个接口转成另一个接口,而外观是为了让接口更简单。

  下一节:模板方法模式

作者:哀&RT
出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/Tony-Anne/p/6514672.html