Java设计模式 —— 【结构型模式】外观模式详解

文章目录


概述

外观模式又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

举个例子,在没有只能家居的时候,我们开灯,开空调,开电视等等一系列操作,都需要我们一件一件来完成;在有了智能家居以后,在智慧生活设定指定的程序,就可以实现一键开启指定的家居。


结构

外观(Facade)模式包含以下主要角色:

  • 外观(Facade)角色: 为多个子系统对外提供一个共同的接口。
  • 子系统(Sub System)角色: 实现系统的部分功能,客户可以通过外观角色访问它。

案例实现

以我们熟知的智能家居为例:

智能音箱就相当于我们的外观类,而家居就相当于一个一个的系统,只需要操作智能音箱就可以实现所有家电的开关。

子系统【电灯、电视、空调】:

java 复制代码
//电灯类
public class Light {
    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 AirCondition {
    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;

    public SmartAppliancesFacade() {
        light = new Light();
        tv = new TV();
        airCondition = new AirCondition();
    }

    public void say(String message) {
        if(message.contains("打开")) {
            on();
        } else if(message.contains("关闭")) {
            off();
        } else {
            System.out.println("我还听不懂你说的!!!");
        }
    }

    //一键开电器
    private void on() {
        light.on();
        tv.on();
        airCondition.on();
    }

    //一键关电器
    private void off() {
        light.off();
        tv.off();
        airCondition.off();
    }
}

测试:

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

优缺点

优点:

  • 简化了调用过程,无需了解深入子系统,防止带来风险;
  • 减少系统依赖、松散耦合,外观模式讲客户端和子系统之间进行解耦;
  • 更好的划分访问层次;
  • 符合迪米特法则,即最少知道原则。

缺点:

  • 增加子系统、扩展子系统行为容易引入风险;
  • 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。
相关推荐
forestsea几秒前
Spring Cloud Alibaba 2025.1.0.0 正式发布:拥抱 Spring Boot 4.0 与 Java 21+ 的新时代
java·spring boot·后端
IT枫斗者1 分钟前
IntelliJ IDEA 2025.3史诗级更新:统一发行版+Spring Boot 4支持,这更新太香了!
java·开发语言·前端·javascript·spring boot·后端·intellij-idea
forestsea1 分钟前
Spring Boot 4.0 + JDK 25 + GraalVM:下一代云原生Java应用架构
java·spring boot·云原生
♡喜欢做梦3 分钟前
Spring Boot 日志实战:级别、持久化与 SLF4J 配置全指南
java·spring boot·后端·spring·java-ee·log4j
青衫码上行6 分钟前
【项目部署】Spring Boot项目部署的四种方式
java·linux·服务器·spring boot·后端·docker·腾讯云
想不明白的过度思考者8 分钟前
你真的会打印日志吗?基于 Spring Boot 的全方位日志指南
java·spring boot·后端·日志
路中行10 分钟前
Spring Cloud Gateway 整合 Knife4j 聚合文档:避坑指南与解决方案(Spring Boot 3.X)
java·spring boot·spring cloud
NGC_661129 分钟前
二分查找算法
java·javascript·算法
海兰1 小时前
ES9.x 银行场景:银行卡可疑交易风控工作流示例
java·elasticsearch·搜索引擎
勇往直前plus1 小时前
深入理解 Python 内存模型:模块、类、对象的存储与运行机制
开发语言·python