设计模式(结构型设计模式——外观模式)

设计模式(结构型设计模式------外观模式)

外观模式

基本定义

外观模式是为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。

外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

模式结构

Facade: 外观角色类

SubSystem: 子系统角色

代码实现

Facade: 外观角色类

模拟:回家-> 开灯,开空调,开电视机。休息->关电视机,关空调,关灯

java 复制代码
public class Facade {

    Light light;
    Air air;
    TV tv;

    public Facade(Light light, Air air, TV tv) {
        this.light = light;
        this.air = air;
        this.tv = tv;
    }

    public void allOpen(){
        light.open();
        air.open();
        tv.open();
    }

    public void allDown(){
        tv.down();
        air.down();
        light.down();
    }
}
SubSystem: 子系统角色

灯光

java 复制代码
@Slf4j
public class Light {

    public void open(){
        log.info("开灯");
    };

    public void down(){
        log.info("关灯");
    }
}

空调

java 复制代码
@Slf4j
public class Air {

    public void open(){
        log.info("打开空调");
    };

    public void down(){
        log.info("关闭空调");
    }
}

电视机

java 复制代码
@Slf4j
public class TV {
    public void open(){
        log.info("打开电视机");
    };

    public void down(){
        log.info("关闭电视机");
    }
}
测试类
java 复制代码
public class Test {

    public static void main(String[] args){
        Facade facade = new Facade(new Light(), new Air(), new TV());
        facade.allOpen();//print: 开灯, 打开空调,打开电视机
        facade.allDown();//print: 关闭电视机,关闭空调,关灯
    }
}

优点

  1. 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  2. 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
  3. 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程。
  4. 符合迪米特法则,即最少知道原则。

缺点

在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了"开闭原则"。

使用场景

当要为一个复杂子系统提供一个简单接口时可以使用外观模式。

客户程序与多个子系统之间存在很大的依赖性。引入外观类将子系统与客户以及其他子系统解耦,可以提高子系统的独立性和可移植性。

总结

外观模式的主要优点就在于减少了客户与子系统之间的关联对象,使用客户对子系统的使用变得简单了,也实现了客户与子系统之间的松耦合关系。它的缺点就在于违背了"开闭原则"。

如果需要实现一个外观模式,需要将子系统组合进外观类中,然后将工作委托给子系统执行。

相关推荐
鼠鼠我捏,要死了捏2 小时前
深入解析Java NIO多路复用原理与性能优化实践指南
java·性能优化·nio
ningqw2 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
superlls2 小时前
(Redis)主从哨兵模式与集群模式
java·开发语言·redis
叫我阿柒啊4 小时前
Java全栈工程师面试实战:从基础到微服务的深度解析
java·redis·微服务·node.js·vue3·全栈开发·电商平台
hqxstudying5 小时前
mybatis过渡到mybatis-plus过程中需要注意的地方
java·tomcat·mybatis
lichkingyang5 小时前
最近遇到的几个JVM问题
java·jvm·算法
ZeroKoop5 小时前
多线程文件下载 - 数组切分,截取文件名称
java
Monly215 小时前
IDEA:控制台中文乱码
java·ide·intellij-idea
叫我阿柒啊6 小时前
从全栈开发到微服务架构:一次真实的Java面试实录
java·redis·ci/cd·微服务·vue3·springboot·jwt
superlls6 小时前
(计算机网络)JWT三部分及 Signature 作用
java·开发语言·计算机网络