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

优缺点

优点:

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

缺点:

  • 增加子系统、扩展子系统行为容易引入风险;
  • 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。
相关推荐
爱读源码的大都督4 分钟前
为什么有了HTTP,还需要gPRC?
java·后端·架构
qq_49244844613 分钟前
Jmeter设置负载阶梯式压测场景(详解教程)
开发语言·python·jmeter
SelectDB技术团队20 分钟前
Apache Doris 内部数据裁剪与过滤机制的实现原理 | Deep Dive
大数据·数据库·apache·数据库系统·数据裁剪
Lucky_Turtle23 分钟前
【Java Xml】Apache Commons Digester3解析
xml·java·apache
聪明的笨猪猪43 分钟前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
FIavor.43 分钟前
我发送给Apifox是http://localhost:9002/goods/getByUserName?name=张三 为什么会是500哪里错了?
java·服务器·网络协议·http
ID_1800790547344 分钟前
京东获取整站实时商品详情数据|商品标题|数据分析提取教程
java·开发语言
WLJT1231231231 小时前
科技赋能塞上农业:宁夏从黄土地到绿硅谷的蝶变
大数据·人工智能·科技
微露清风1 小时前
系统性学习C++-第五讲-内存管理
java·c++·学习
计算机毕业设计木哥1 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的快递物流仓库管理系统【源码+文档+调试】
java·vue.js·spring boot·后端·课程设计