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

server/2024/12/29 1:15:18/

文章目录

  • 概述
  • 结构
  • 案例实现
  • 优缺点


概述

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

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


结构

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

在这里插入图片描述


优缺点

优点:

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

缺点:

  • 增加子系统、扩展子系统行为容易引入风险;
  • 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。

http://www.ppmy.cn/server/154065.html

相关文章

hhdb客户端介绍(57)

技术选型 选择 MySQL 数据库的原因 开源免费: MySQL 作为一款开源数据库,不仅免费提供给用户,还具备强大的功能和灵活性,有效降低了企业的软件许可成本。 卓越的性能: 在处理大规模数据集和高并发访问时,…

为什么在Cloudflare域名绑定添加DNS后,域名+端口无法访问?(Cloudflare域名+端口无法访问的问题详解)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Cloudflare 域名+端口无法访问 📒📝 问题示例📝 出现原因分析🔍 1. Cloudflare 的代理工作原理🔍 2. 问题核心📝 解决方案🎯 方法 1🎯 方法 2🎯 方法 3🎯 方法 4(推荐)🔖 配置示例⚓️ 相关链接 ⚓️�…

【Redis】Redis 安装与启动

在实际工作中,大多数企业选择基于 Linux 服务器来部署项目。本文演示如何使用 MobaXterm 远程连接工具,在 CentOS 7 上安装和启动 Redis 服务(三种启动方式,包括默认启动、指定配置启动和开机自启)。在安装之前&#x…

mprpc框架代码详解

protobuf协议 首先,当我们在proto文件中定义了一个Service类 service MonitorManager { rpc SetMonitorInfo(MonitorInfo) returns(google.protobuf.Empty) {} rpc GetMonitorInfo(QueryMessage) returns(QueryResults) {} }经过proto插件自动生成monitor_info.pb.…

WebClient HTTP 请求问题处理模板(泛型响应、忽略 SSL 证书等)

一、请求大数据 1、问题案例 (1)Server 该接口返回一段大小为 1MB 的字符串 GetMapping(“/testBigData”) public String testBigData() { int targetSize 1024 * 1024; // 1MB StringBuilder sb new StringBuilder(targetSize); for (int i 0; i …

MySQL数据库——数据类型,索引,事务,优化

目录 数据类型 存储MD5用varchar还是char 用varchar存储一本小说 datetime,timstamp myisam和innodb有什么区别 索引 MySQL索引的优缺点 索引失效的原因 聚集索引和非聚集索引 MySQL索引采用B树 B,B树 为什么SQL语句命中索引比不命中快 事务 事务的隔离级别 实现…

Django 中的 reverse 【反向/逆转/扭转/逆向】使用详解以及使用案例

Django 中的 reverse 使用详解 reverse :中文翻译:反向/逆转/扭转/逆向 什么是 reverse 方法? Django 中的 reverse 方法用于根据视图的名称和传递的参数,动态生成URL。这样做的好处是,如果你在 urls.py 中更改了URL模式&#x…

【Java基础面试题038】栈和队列在Java中的区别是什么?

回答重点 栈(Stack):遵循后进先出(LIFO,Last In,First Out)原则。即,最后插入的元素最先被移除。主要操作包括push(入栈)和pop(出栈)…