当前位置: 首页 > news >正文

10、外观模式(Facade Pattern,不常用)

外观模式(Facade Pattern)也叫作门面模式,通过一个门面(Facade)向客户端提供一个访问系统的统一接口,客户端无须关心和知晓系统内部各子模块(系统)之间的复杂关系,其主要目的是降低访问拥有多个子系统的复杂系统的难度,简化客户端与其之间的接口。外观模式将子系统中的功能抽象成一个统一的接口,客户端通过这个接口访问系统,使得系统使用起来更加容易。

简单来说,外观模式就是将多个子系统及其之间的复杂关系和调用流程封装到一个统一的接口或类中以对外提供服务。这种模式涉及3种角色。

  • 子系统角色:实现了子系统的功能。
  • 门面角色:外观模式的核心,熟悉各子系统的功能和调用关系并根据客户端的需求封装统一的方法来对外提供服务。
  • 客户角色:通过调用Facade来完成业务功能。

以汽车的启动为例,只需按下启动按钮,后台就会自动完成引擎启动、仪表盘启动、车辆自检等过程。通过外观模式将汽车启动这一系列流程封装到启动按钮上,对于用户来说只需按下启动按钮即可,不用太关心具体的细节。UML设计图如下:

1)定义Engine类:

@Slf4j
public class Engine {public void startup() {log.info("engine startup...");}public void shutdown() {log.info("engine shutdown...");}
}

2)定义Dashboard类:

@Slf4j
public class Dashboard {public void startup() {log.info("dashboard startup...");}public void shutdown() {log.info("dashboard shutdown...");}
}

3)定义SelfCheck类:

@Slf4j
public class SelfCheck {public void startup() {log.info("SelfCheck startup...");}public void shutdown() {log.info("SelfCheck shutdown...");}
}

4)定义门面类Starter封装Engine、Dashboard、SelfCheck:

package cn.jaa.facade_pattern;import lombok.extern.slf4j.Slf4j;/*** @Author: Jaa* @Description: 启动按钮* @Date 2023/11/30*/
@Slf4j
public class Starter {private Engine engine;private Dashboard dashboard;private SelfCheck selfCheck;public Starter() {this.engine = new Engine();this.dashboard = new Dashboard();this.selfCheck = new SelfCheck();}public void startup() {log.info("====car begin startup====");engine.startup();dashboard.startup();selfCheck.startup();log.info("====car startup finished====");}public void shutdown() {log.info("====car begin shutdown====");engine.shutdown();dashboard.shutdown();selfCheck.shutdown();log.info("====car shutdown finished====");}
}

5)测试外观模式:

package cn.jaa.facade_pattern;import lombok.extern.slf4j.Slf4j;/*** @Author: Jaa* @Description: 外观模式测试类* @Date 2023/11/30*/
@Slf4j
public class FacadeDemoTest {public static void main(String[] args) {Starter starter = new Starter();// 启动汽车starter.startup();// 熄灭汽车starter.shutdown();}
}

运行结果:

相关文章:

  • Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境
  • 网站提示不安全?
  • vue.js el-table 动态单元格列合并
  • 【改进YOLOv8】融合高效网络架构 CloAtt的焊缝识别系统
  • Linux下Redis安装及配置
  • 好用免费的AI换脸5个工具
  • form表单的数据校验可以自定义规则,定义验证器(validator)
  • 【USRP】5G / 6G 原型系统 5g / 6G prototype system
  • Large Language Models areVisual Reasoning Coordinators
  • CSS新手入门笔记整理:CSS列表样式
  • 如何判断数据库慢 SQL 查询?
  • Windows+WSL开发环境下微服务注册(Consul)指定IP
  • ros来保存图像和保存记录视频的方法---gmsl相机保存视频和图片
  • linux学习之详解文件
  • git 配置多端多个账号(码云、github、gitlab)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS从零开始部署Nodejs项目
  • chrome扩展demo1-小时钟
  • CSS中外联样式表代表的含义
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • echarts花样作死的坑
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • jdbc就是这么简单
  • laravel with 查询列表限制条数
  • mysql常用命令汇总
  • php面试题 汇集2
  • 安装python包到指定虚拟环境
  • 初探 Vue 生命周期和钩子函数
  • 后端_ThinkPHP5
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 双管齐下,VMware的容器新战略
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 异步
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 阿里云ACE认证学习知识点梳理
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​iOS实时查看App运行日志
  • !!Dom4j 学习笔记
  • !!java web学习笔记(一到五)
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)逆序输出字符串
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全