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

    设计模式-外观模式

  • 相关阅读:
    【面试经典150 | 栈】最小栈
    Python基础库-JSON库
    3.3 Institution
    java毕业生设计医院取药系统计算机源码+系统+mysql+调试部署+lw
    Spring中Bean的生命周期
    reentrantLock
    Redis源码学习(30),字典学习,dict.h
    LeetCode_6_Z字形变换
    10款超牛Vim插件,爱不释手了
    【AI应用】海康威视iVMS-4200软件安装
  • 原文地址:https://blog.csdn.net/qq_41398418/article/details/128144458