23种设计模式-外观(Facade)设计模式

外观设计模式

🚩什么是外观设计模式?

外观设计模式(Facade Pattern) 是一种 结构型设计模式 ,它提供了一个 统一的接口 ,用于访问子系统中的一组接口。外观模式通过定义一个 高层接口,简化了客户端与子系统之间的交互,隐藏了子系统的复杂性。

使用场景

  • 当需要为 复杂的子系统 提供一个 简单的接口 时。

  • 当需要 解耦客户端与子系统 时,使子系统更容易维护和扩展。

  • 当需要 分层构建系统 时,外观模式可以作为每层的入口点。

🚩外观设计模式的特点

  • 简化接口:外观模式提供了一个简化的接口,隐藏了子系统的复杂性。

  • 解耦:客户端与子系统之间通过外观接口交互,降低了耦合度。

  • 易用性:客户端无需了解子系统的内部细节,只需调用外观接口即可。

  • 灵活性:子系统可以独立变化,只要外观接口保持不变,客户端代码无需修改。

🚩外观设计模式的结构

外观模式主要包含以下部分:

  • Facade(外观):提供一个统一的接口,客户端通过该接口与子系统交互。

  • SubSystem(子系统):由多个类或模块组成,实现具体的功能。

  • Client(客户端) :通过 Facade 接口与子系统交互,无需直接调用子系统的类。

🚩外观设计模式的优缺点

✅ 优点

  • 简化接口:外观模式提供了一个简化的接口,隐藏了子系统的复杂性。

  • 解耦:客户端与子系统之间通过外观接口交互,降低了耦合度。

  • 易用性:客户端无需了解子系统的内部细节,只需调用外观接口即可。

  • 灵活性:子系统可以独立变化,只要外观接口保持不变,客户端代码无需修改。

❌ 缺点

  • 不符合开闭原则:如果子系统需要新增功能,可能需要修改外观接口。

  • 过度依赖:客户端可能过度依赖外观接口,导致外观接口变得臃肿。

🚩外观设计模式的Java实现

代码地址:GitHub

  • 创建 子系统类 SubSystemOne、SubSystemTwo 和 SubSystemThree,分别实现具体的功能。

    • 子系统1SubSystemOne
    java 复制代码
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName SubSystemOne
     * @Description 子系统1
     * @date 2025/3/24 17:00
     **/
    public class SubSystemOne {
        public void methodOne() {
            System.out.println("执行子系统一的功能");
        }
    }
    • 子系统2SubSystemTwo
    java 复制代码
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName SubSystemTwo
     * @Description 子系统2
     * @date 2025/3/24 17:03
     **/
    public class SubSystemTwo {
        public void methodTwo() {
            System.out.println("执行子系统二的功能");
        }
    }
    • 子系统3SubSystemThree
    java 复制代码
    /**
     * @author hanson.huang
     * @version V1.0
     * @ClassName SubSystemThree
     * @Description 子系统3
     * @date 2025/3/24 17:04
     **/
    public class SubSystemThree {
        public void methodThree() {
            System.out.println("执行子系统三的功能");
        }
    }
  • 创建 外观类 Facade,提供一个统一的接口,封装子系统的调用。

java 复制代码
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName Facade
 * @Description 外观类
 * @date 2025/3/24 17:04
 **/
public class Facade {

    SubSystemOne subSystemOne;
    SubSystemTwo subSystemTwo;
    SubSystemThree subSystemThree;

    public Facade() {
        subSystemOne = new SubSystemOne();
        subSystemTwo = new SubSystemTwo();
        subSystemThree = new SubSystemThree();
    }

    public void methodA() {
        subSystemOne.methodOne();
    }

    public void methodB() {
        subSystemTwo.methodTwo();
    }

    public void methodC() {
        subSystemThree.methodThree();
    }
}
  • 测试外观模式
java 复制代码
/**
 * @author hanson.huang
 * @version V1.0
 * @ClassName FacadePattern
 * @Description 测试外观模式
 * @date 2025/3/24 17:08
 **/
public class FacadePattern {

    public static void main(String[] args) {
        Facade facade = new Facade();

        facade.methodA();
        facade.methodB();
        facade.methodC();
    }
}

📌 运行结果

🚩代码总结

  • 子系统类 SubSystemOne、SubSystemTwo 和 SubSystemThree 分别实现具体的功能。

  • 外观类 Facade 提供一个统一的接口,封装子系统的调用。

  • 客户端 通过 外观类 与子系统交互,无需直接调用子系统的类。

🚩总结

  • 外观设计模式(Facade Pattern) 提供了一个 统一的接口,用于访问子系统中的一组接口,简化了客户端与子系统之间的交互。

  • 适用于 为复杂子系统提供简单接口解耦客户端与子系统分层构建系统 的场景。

  • Java 实现 需要 定义子系统类外观类,并通过外观类封装子系统的调用。

✅ 适用场景:

  • 需要为 复杂的子系统 提供一个 简单的接口 时。

  • 需要 解耦客户端与子系统 时。

  • 需要 分层构建系统 时。

  • Java中许多地方用到了外观模式,在Java的GUI编程中,javax.swing 包大量运用了外观模式。例如,创建一个简单的窗口,你可以借助 JFrame 这个外观类,而不用直接去操作底层复杂的窗口创建和管理机制。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关推荐
Layux9 分钟前
flowable候选人及候选人组(Candidate Users 、Candidate Groups)的应用包含拾取、归还、交接
java·数据库
Mylvzi9 分钟前
Spring Boot 中 @RequestParam 和 @RequestPart 的区别详解(含实际项目案例)
java·spring boot·后端
Magnum Lehar30 分钟前
vulkan游戏引擎的核心交换链swapchain实现
java·前端·游戏引擎
半青年43 分钟前
IEC61850规约客户端软件开发实战(第二章)
java·c++·qt·网络协议·c#·信息与通信·iec61850
zzj_2626101 小时前
头歌java课程实验(学习-Java字符串之正则表达式之元字符之判断字符串是否符合规则)
java·学习·正则表达式
_extraordinary_1 小时前
Java 异常
java·开发语言
会飞的架狗师1 小时前
【SpringBoot实战】优雅关闭服务
java·spring boot·后端
无处不在的海贼1 小时前
小明的Java面试奇遇之:支付平台高并发交易系统设计与优化[特殊字符]
java·开发语言·面试
居居飒1 小时前
深入理解 JDK、JRE 和 JVM 的区别
java·开发语言·jvm
Bro_cat2 小时前
JVM 核心组件深度解析:堆、方法区、执行引擎与本地方法接口
java·jvm