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

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

日常叨逼叨

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


外观模式

概念

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

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

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

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

案例

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

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

java 复制代码
//空调
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("关闭了灯....");
    }
}

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

java 复制代码
//智能音箱
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();
    }
}

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

java 复制代码
public class Client {
    public static void main(String[] args) {
        //创建外观对象
        SmartAppliancesFacade facade = new SmartAppliancesFacade();
        //客户端直接与外观对象进行交互
        facade.say("小雷同学,请打开家电");
//        facade.say("关闭家电");
    }
}

执行结果:

打开了灯...

打开了电视...

打开了空调...

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

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

优缺点

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

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

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

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

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

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


相关推荐
Zane19943 小时前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫1 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19941 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19942 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..2 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1503 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)3 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki4 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅664 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa4 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio