• 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 设计模式-外观模式

    设计模式-外观模式

  • 相关阅读:
    宠物经济大热,品牌应如何巧借东风搭上这趟营销顺风车呢?
    [Hive] CTE 通用表达式 WITH关键字
    基于开源的BPM流程引擎VS天翎自研BPM流程引擎
    rsync远程同步
    如何使用XSSFWorkbook读取文本薄?
    如何一键转发朋友圈,快速跟圈?
    css实现流星划过动画
    LeetCode 每日一题 2021/6/20-2021/6/26
    王道数据结构7(查找)
    MySQL面试真题(二十七)——RFM分析法对用户进行分类
  • 原文地址:https://blog.csdn.net/qq_41398418/article/details/128144458