• 设计模式:外观模式


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

      场景:有一个家庭影院,里面有爆米花机,投影,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/
    您的支持是对博主最大的鼓励,感谢您的认真阅读。
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    K3Wise K3List.OCX引入dotnet问题处理方法
    k3wise dotnet开发老单据时序簿工具条添加按钮
    c#调用dotnet写的com组件碰到注册失败的错误的补救方法
    bat注册dotnet com
    dotnet动态加载以及卸载dll的代码
    c#获取com对象的progid
    jpg和png的区别
    Fragment的FragmentTransaction 的commit()和commitAllowingStateLoss()以及commitNow()和commitNowAllowingStateLoss()
    Java泛型类型擦除与运行时类型获取
    rxjava介绍
  • 原文地址:https://www.cnblogs.com/Tony-Anne/p/6514672.html
Copyright © 2020-2023  润新知