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

优缺点

优点:

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

缺点:

  • 增加子系统、扩展子系统行为容易引入风险;
  • 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。
相关推荐
**蓝桉**2 分钟前
数组的执行原理,java程序的执行原理
java·开发语言
YDS8296 分钟前
MyBatis-Plus精讲 —— 从快速入门到项目实战
java·后端·spring·mybatis·mybatis-plus
dragonzoebai12 分钟前
ol加载互联网瓦片大于18级时空白
大数据
waeng_luo14 分钟前
[鸿蒙2025领航者闯关] 表单验证与用户输入处理最佳实践
开发语言·前端·鸿蒙·鸿蒙2025领航者闯关·鸿蒙6实战·开发者年度总结
高频交易dragon17 分钟前
5分钟和30分钟联立进行缠论信号分析
开发语言·python
ULTRA??19 分钟前
C/C++函数指针
c语言·开发语言·c++
BBB努力学习程序设计20 分钟前
Java条件判断:程序的"决策大脑"
java
还没想好取啥名20 分钟前
C++11新特性(一)——自动类型推导
开发语言·c++·stl
我是华为OD~HR~栗栗呀23 分钟前
华为OD-C面经-23届学院哦
java·c++·python·华为od·华为·面试
xiaozi412029 分钟前
Ruey S. Tsay《时间序列分析》Python实现笔记:综合与应用
开发语言·笔记·python·机器学习