美文网首页
设计模式学习专栏七--------外观模式

设计模式学习专栏七--------外观模式

作者: 你的头发真的好长 | 来源:发表于2019-03-11 23:00 被阅读0次

    设计模式学习专栏七--------外观模式

    场景


    在我们进入外观模式之前 , 让我们看一个风行全美的热潮: 建立自己的家庭影院

    经过一番研究比较,你组装了一套杀手级别的系统 , 内含DVD播放器, 投影机, 自动屏幕, 环绕立体声 ,甚至还有爆米花机.

    以下是相关的组件

    image

    正当一切部署完成,想要开始享受一部电影时,却发现...

    image

    使用代码实现看电影

    image

    出现的问题

    我们的客户端需要面对太多具体的组件了 ! 导致操作家庭影院很麻烦

    如何解决


    使用外观模式, 通过实现一个提供更合理的接口的外观类 , 让我们可以将一个复杂的子系统变得更容易使用

    image

    外观模式总览


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

    • 模式的理解

      • 类图

        image
      • 角色

        • 客户 : 客户只有一个朋友,也就是外观 , 避免了和系统中太多的类耦合到了一起
        • 外观类 : 外观类帮助客户管理全部子系统组件,它的存在让客户变得简单又有弹性
        • 子系统中的类
    • 外观模式与适配器模式的区别

      • 适配器的意图是要转换被适配接口 成客户期望的另一个接口
        而外观的意图是要统一和简化接口

    核心代码部分

    主程序

    public class HomeTheaterTestDrive {
        public static void main(String[] args) {
            Amplifier amp = new Amplifier("Top-O-Line Amplifier");
            Tuner tuner = new Tuner("Top-O-Line AM/FM Tuner", amp);
            DvdPlayer dvd = new DvdPlayer("Top-O-Line DVD Player", amp);
            CdPlayer cd = new CdPlayer("Top-O-Line CD Player", amp);
            Projector projector = new Projector("Top-O-Line Projector", dvd);
            TheaterLights lights = new TheaterLights("Theater Ceiling Lights");
            Screen screen = new Screen("Theater Screen");
            PopcornPopper popper = new PopcornPopper("Popcorn Popper");
    
            HomeTheaterFacade homeTheater =
                    new HomeTheaterFacade(amp, tuner, dvd, cd,
                            projector, screen, lights, popper);
            //客户只与外观直接交互
            homeTheater.watchMovie("Raiders of the Lost Ark");
            homeTheater.endMovie();
        }
    }
    

    外观

    public class HomeTheaterFacade {
        Amplifier amp;      //子系统中的各个组件
        Tuner tuner;
        DvdPlayer dvd;
        CdPlayer cd;
        Projector projector;
        TheaterLights lights;
        Screen screen;
        PopcornPopper popper;
     
        public HomeTheaterFacade(Amplifier amp, 
                     Tuner tuner, 
                     DvdPlayer dvd, 
                     CdPlayer cd, 
                     Projector projector, 
                     Screen screen,
                     TheaterLights lights,
                     PopcornPopper popper) {
     
            this.amp = amp;
            this.tuner = tuner;
            this.dvd = dvd;
            this.cd = cd;
            this.projector = projector;
            this.screen = screen;
            this.lights = lights;
            this.popper = popper;
        }
     
        public void watchMovie(String movie) {
            System.out.println("Get ready to watch a movie...");
            popper.on();
            popper.pop();
            lights.dim(10);
            screen.down();
            projector.on();
            projector.wideScreenMode();
            amp.on();
            amp.setDvd(dvd);
            amp.setSurroundSound();
            amp.setVolume(5);
            dvd.on();
            dvd.play(movie);
        }
    }
    
    • 输出结果

      Get ready to watch a movie...
      Popcorn Popper on
      Popcorn Popper popping popcorn!
      Theater Ceiling Lights dimming to 10%
      Theater Screen going down
      Top-O-Line Projector on
      Top-O-Line Projector in widescreen mode (16x9 aspect ratio)
      Top-O-Line Amplifier on
      Top-O-Line Amplifier setting DVD player to Top-O-Line DVD Player
      Top-O-Line Amplifier surround sound on (5 speakers, 1 subwoofer)
      Top-O-Line Amplifier setting volume to 5
      Top-O-Line DVD Player on
      Top-O-Line DVD Player playing "Raiders of the Lost Ark"
      

    参考

    ​ 书籍: HeadFirst设计模式

    ​ 代码参考地址: 我就是那个地址

    相关文章

      网友评论

          本文标题:设计模式学习专栏七--------外观模式

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