• Head First设计模式(阅读笔记)-08.外观模式


    家庭影院

    在观看电影前,需要进行一系列的操作,比如打开爆米花机、打开投影仪等等,观看完毕后还要把这些设备全部关闭,这样的操作十分繁琐,该怎么去简化?


    public class HomeTheaterTest{
        public static void main(String[] args){
            poper.on();
            projector.on();
            dvd.on();
            ...
            poper.off();
            projector.off();
            dvd.off();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    外观模式

    • 提供一个统一的接口用来访问子系统中的一堆接口,其实就是提供一个高层接口
    • 让客户和子系统之间避免紧耦合,保证了最少知识原则

    最少知识原则

    尽量避免太多类耦合,为了保证该原则,在某个对象某个方法中,应该调用以下范围的方法:

    • 该对象本身的方法
    • 方法参数中的对象的方法
    • 方法中创建的任何对象
    • 对象的任何组件

    // 正确示范
    public class Car{
    	Engine engine;  // ① engine为Car类的组件
        public void start(Key key){  // ② key为参数中的对象
            Doors doors = new Doors();  // ③ 方法中创建的对象
            boolean authorized = key.turns();  // 调用②的方法
            if(authorized){
                engine.start();  // 调用①的方法
                updateDashboard();  // 调用④
                doors.lock();  // 调用③的方法
            }
        }
        public void updateDashboard(){  // ④ 对象本身的方法
            ...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    // 错误示范
    public float getTemp(){
        Thermometer thermometer = station.getThermometer();  // 多创建一个类,没有必要
        return thermometer; 
    }
    // 正确示范
    public float getTemp(){
        // station是当前类的组件
        return station.getThermometer();  // 减少依赖类的数目
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    构建家庭影院外观

    使用组合让外观能够访问子系统中所有的组件


    public class HomeTheaterFacade{
        PopcornPopper popper;
        Projector projector;
        DVDPlayer dvd;
        public HomeTheaterFacade(PopcornPopper popper, Projector projector,DVDPlayer dvd){
            this.popper = popper;
            this.projector = projector;
            this.dvd  = dvd;
        }
        // 具体代码在“实现简化的接口”
        public void watchMovie(String movie){...}
        public void endMovie(){...}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    实现简化的接口

    将子系统的组件整合为统一的接口用于访问


    public void watchMovie(String movie){
        popper.on();
        projector.on();
        dvd.on();
        dvd.play(movie);
    }
    public void endMovie(){
        popper.off();
        projector.off();
        dvd.off();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    观赏电影

    public class HomeTheaterTest{
        public static void main(String[] args){
            // 实例化组件,这里省略
            HomeTheaterFacade homeTheater = new HomeTheaterFacade(popper, projector, dvd);
            homeTheater.watchMovie("xxx");
            homeTheater.endMovie();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    外观、装饰者、适配器模式

    • 装饰者模式不改变接口,但是加入责任(将一个对象包装起来以增加新的行为和责任)
    • 适配器模式将一个接口转换为另一个接口(将一个对象包装起来以改变其接口)
    • 外观模式让接口更加简单(将一群对象包装起来简化其接口)

    参考

    Head First 设计模式-外观模式

    设计模式-外观模式

  • 相关阅读:
    推推:产品的规划和商业化分析
    【React】表单
    从实际案例聊聊Java应用的GC优化
    线上问题:Harbor核心服务不可用
    HarmonyOS开发:走进静态共享包的依赖与使用
    树结构的实际应用
    svg之全局组件,配合雪碧图解决vue2的svg优化问题
    论文浅尝 | 探索用于归纳型知识图谱补全的关系语义
    电子与通信专业英语(第2版)Electronic Components课文补充
    手写单例模式
  • 原文地址:https://blog.csdn.net/qq_41398418/article/details/128144458