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("关闭");
    }
}

优缺点

优点:

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

缺点:

  • 增加子系统、扩展子系统行为容易引入风险;
  • 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。
相关推荐
点燃大海1 分钟前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran3 分钟前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring
黑马师兄16 分钟前
RAG混合检索深度解析:让AI真正找到你要的内容
java·人工智能·ai·agent·rag·ai-native
码客日记20 分钟前
Spring Boot 配置文件敏感信息加密(Jasypt 企业级完整方案)
java·spring boot·git
宋拾壹35 分钟前
同时添加多个类目
android·开发语言·javascript
凡人叶枫1 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
嘉子的秃头日记1 小时前
TRO 2026|轮椅也能“猜到”用户想往哪走?
大数据·人工智能·机器学习
2601_957190901 小时前
极致裸眼沉浸!飞行影院重塑文旅游玩新体验
大数据·人工智能·旅游
极客先躯1 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
NE_STOP1 小时前
Raft算法处理细节
java