• 设计模式浅析(八) ·外观模式


    设计模式浅析(八) ·外观模式

    日常叨逼叨

    java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁


    外观模式

    概念

    外观模式(Facade Pattern)是一种设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更加容易使用。这种设计模式的主要目的是降低系统的复杂性,简化客户端与子系统之间的交互。

    外观(Facade)模式是“迪米特法则”的典型应用。

    迪米特法则:又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。

    组成
    1. 外观类(Facade):这是外观模式的核心。外观类为客户端提供了一个简洁的接口,用于访问子系统中的功能。外观类内部通常包含了对子系统多个组件的引用,并且提供了高层次的方法来调用这些组件。客户端不需要直接与子系统组件交互,而是通过外观类来间接访问它们。
    2. 子系统组件(Subsystem Components):这些是子系统中实际执行操作的类。它们实现了具体的功能,但通常对于客户端来说是不可见的。外观类负责协调这些组件的工作,并将结果呈现给客户端。
    3. 客户端(Client):客户端是使用外观模式的代码部分。它只需要与外观类交互,而不需要了解子系统的具体实现细节。客户端通过调用外观类提供的方法,可以间接地使用子系统提供的功能。

    案例

    我就以自己家里的一些家电为例子,比如我家有电灯,空调,电视这三种家电,然后呢他们都有自己独立的开关,我如果我想要让它们都处于工作状态,我得一件一件地去打开他们的开关,但是呢,我个人比较懒,想着能不能接入一个小雷同学,让它去负责各个家电,我只需要操作小雷同学就可以?

    说干就干,首先是我家里的各个电器

    //空调
    public class AirCondition {
        public void on() {
            System.out.println("打开了空调....");
        }
    
        public void off() {
            System.out.println("关闭了空调....");
        }
    }
    //电视机
    public class TV {
        public void on() {
            System.out.println("打开了电视....");
        }
    
        public void off() {
            System.out.println("关闭了电视....");
        }
    }
    //灯
    public class Light {
        public void on() {
            System.out.println("打开了灯....");
        }
    
        public void off() {
            System.out.println("关闭了灯....");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    然后呢,我接入一个小雷同学

    //智能音箱
    public class SmartAppliancesFacade {
    
        private Light light;
        private TV tv;
        private AirCondition airCondition;
    
        //other household appliance
    
        public SmartAppliancesFacade() {
            light = new Light();
            tv = new TV();
            airCondition = new AirCondition();
        }
    
        public void say(String message) {
            if (message.contains("开灯")) {
                onLamp();
            } else if (message.contains("关灯")) {
                offLamp();
            } else if (message.contains("开电视")) {
                onTV();
            } else if (message.contains("关电视")) {
                offTV();
            } else if (message.contains("开空调")) {
                onAirCondition();
            } else if (message.contains("关空调")) {
                offAirCondition();
            } else if (message.contains("打开家电")) {
                onLamp();
                onTV();
                onAirCondition();
                //on other household appliance
            } else if (message.contains("关闭家电")) {
                offLamp();
                offTV();
                offAirCondition();
                //off other household appliance
            } else {
                System.out.println("我还听不懂你说的!!!");
            }
        }
    
        private void onLamp() {
            light.on();
        }
    
        private void offLamp() {
            light.off();
        }
    
        private void onTV() {
            tv.on();
        }
    
        private void offTV() {
            tv.off();
        }
    
        private void onAirCondition() {
            airCondition.on();
        }
    
        private void offAirCondition() {
            airCondition.off();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    而对于我来说,我只需要知道小雷同学,而不需要知道各个家电。

    public class Client {
        public static void main(String[] args) {
            //创建外观对象
            SmartAppliancesFacade facade = new SmartAppliancesFacade();
            //客户端直接与外观对象进行交互
            facade.say("小雷同学,请打开家电");
    //        facade.say("关闭家电");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    执行结果:

    打开了灯…
    打开了电视…
    打开了空调…

    这样,对于客户端来说,可以通过一个智能音箱控制全部,而不用管其他的具体实现,只要知道这个接口即可以了。

    但是在一些具体的示例中,外观模式的使用可能有所差异,望各位看官老爷们斟酌使用。

    优缺点

    外观模式的主要优点包括:

    • 简化了客户端的使用:客户端只需要与外观类交互,而不需要了解子系统的复杂性。
    • 降低了系统的耦合度:外观类将客户端与子系统解耦,减少了它们之间的直接依赖。
    • 提供了统一的接口:外观类为子系统提供了一个统一的接口,使得子系统更加容易集成和扩展。

    然而,外观模式也有一些潜在的缺点,比如:

    • 过度集中化:如果外观类承担了太多的责任,它可能会变得过于复杂和难以维护。
    • 不适合所有场景:对于某些系统来说,外观模式可能并不是最合适的设计选择。如果子系统非常简单,或者客户端需要直接访问子系统组件,那么外观模式可能并不适用。

    代码相关代码可以参考 代码仓库🌐

    ps:本文原创,转载请注明出处


  • 相关阅读:
    情感分析系列(四)——使用BERT进行情感分析
    The 19th Zhejiang Provincial Collegiate Programming Contest
    (七):jenkies构建vue
    关于win10 18362版之后的版本一个Bug
    面试题库(二)1:hashmap1.7跟1.8?优化点?红黑树化为什么是8?退化为什么?
    【前端】Vue+Element UI案例:通用后台管理系统-Echarts图表准备:axios封装、mock数据模拟实战
    K8S 二进制部署
    优惠券的工厂与策略模式实现方案
    mysql-linux归档版安装
    SiO2二氧化硅标记多肽GE11(HYWYGYTTPQNVI)(SiO2-GEII)
  • 原文地址:https://blog.csdn.net/Jerrylau213/article/details/136246835