设计模式篇---外观模式

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式引入了一个新的外观类,它为多个业务类的调用提供了一个统一的入口。主要优点是对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数量。
举个例子,比如查询人员的权限,客户端可以调用外观类的方法,外观类中封装一个方法,方法里面依次调用两个实现类,该方法先是示查询出人员的角色,然后根据查出来的角色去查询角色的权限。将客户端与实现类进行解耦,就不用客户端调两次了,客户端只需要调用外观类一次即可。

结构

在这里插入图片描述

Facade(外观角色):外观角色中知道一个或多个子系统的功能和责任。它用来将客户端发来的请求委派到相应的子系统,传递给乡音的子系统对象处理。
SubSystem(子系统角色):系统中可以有一个或多个子系统角色,每一个子系统都可以被客户端直接调用,或者被外观角色调用。子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。

实例

比如我们上班回家后,要做的事情依次是开门、开灯、打开电视,现在用外观模式来完成这个过程。
在这里插入图片描述

Door 类

public class Door {public void openDoor(){System.out.println("门开了");}}

Lamp类

public class Lamp {public void turnOnLight(){System.out.println("灯开了");}
}

TV类

public class TV {public void turnOnTv() {System.out.println("电视开了");}}

Facade类

public class Facade {private TV tv = new TV();private Door door = new Door();private Lamp lamp = new Lamp();public void open() {tv.turnOnTv();door.openDoor();lamp.turnOnLight();}}

Client 端

public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.open();}
}

如果不用外观模式,则客户端的调用方式是这样的:

public class Client {public static void main(String[] args) {Door door = new Door();Lamp lamp = new Lamp();TV tv = new TV();door.openDoor();lamp.turnOnLight();tv.turnOnTv();}
}

上面是客户端直接调用业务实现类,需要依赖三个子系统,而使用外观模式,则只需要关联一个外观类,降低了系统的耦合度。

总结

优点:
1、它对客户端屏蔽了子系统,减少了客户端所需处理的对象数目,客户端代码变得很简单。
2、它实现了子系统和客户端的松耦合关系,使得子系统的变化不会影响到客户端,只需要更改外观类即可。
缺点:
1、违背开闭原则,有新的子系统加入需要修改外观类。

外观模式和建造者模式的思路很相似。外观模式是将复杂的子系统操作给外观类,客户端直接调用外观类即可;建造者模式是将复杂的操作给指挥者,指挥者内部指挥建造者创建,客户端直接关联指挥者即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

18张值得收藏的高清卫星影像

这里分享的18张高清卫星影像,由吉林一号卫星拍摄。 原图来自长光卫星嘉宾在直播中分享的PPT演示文档。 18张高清卫星影像 吉林一号高分04A星,于2022年05月21日拍摄的北京紫禁城高清卫星影像。 北京紫禁城 云南昆明滇池国际会展中心高清卫星影像&…

永洪BI安装字体教程

操作系统缺少中文字体造成部分字体显示不全 字体下载链接:百度网盘 请输入提取码 提取码:0opj 安装命令: 创建文件夹,并放入字体文件 # mkdir /usr/share/fonts/Chinese 建立字体索引信息,更新字体缓存 # cd /usr/share/fonts/C…

jQuery【回到顶部、Swiper轮播图、立即执行函数、链式调用、参数重载、jQuery扩展】(六)-全面详解(学习总结---从入门到深化)

目录 回到顶部 Swiper轮播图 jQuery源码_立即执行函数 jQuery源码_链式调用 jQuery源码_参数重载 jQuery扩展 回到顶部 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compati…

如何去阅读源码,我总结了18条心法

那么到底该如何去阅读源码呢&#xff1f;这里我总结了18条心法&#xff0c;助你修炼神功 学好JDK 身为一个Javaer&#xff0c;不论要不要阅读开源项目源码&#xff0c;都要学好JDK相关的技术。 所有的Java类开源项目&#xff0c;本质上其实就是利用JDK已有的类库和关键字实现…

这13个不经意却很不卫生的行为,很多人都没意识到

这13个不经意却很不卫生的行为&#xff0c;很多人都没意识到 北京崇文中方中医医院名医馆 2023-11-11 17:01 发表于北京 我们在生活中不经意间做出的一些动作&#xff0c;或者日常养成的一些行为习惯&#xff0c;正在悄悄伤害着我们的身体健康。可惜的是很多人都不知道这一点…

了解UniApp常用方法

UniApp 是一个跨平台的应用开发框架&#xff0c;为开发者提供了丰富的原生 API 封装和扩展能力&#xff0c;以便于快速构建应用。在 UniApp 中&#xff0c;有许多常用的方法可供开发者使用&#xff0c;以下是对部分常用方法进行的总结和介绍。 页面生命周期方法 页面生命周期方…

archery修改为不能自提自审核上线SQL

目录 背景修改代码效果参考 背景 我和同事都可以提交上线SQL&#xff0c;但是不能自己提交的SQL自己去审核通过。目前的情况是可以自提自审。 修改代码 找到/opt/archery/sql/utils/workflow_audit.py文件 ...省略...# 判断用户当前是否是可审核staticmethoddef can_revie…

VMware Workstation系列:Windows10 优化VMware虚拟机运行速度总结(单台、多台-ESXI)

Windows10 优化VMware虚拟机运行速度总结 一. 单台或两台同时运行前言&#xff1a;优化方法环境&#xff1a; 1、清除多余快照2、清理磁盘。3、虚拟机全局设置5、设置“优先级”6、设置“设备”7、编辑虚拟机设置8、分配合适的内存和CPU 二. 多台并行背景&#xff1a;一. 下载1…

【书籍篇】Git 学习指南(三)版本库与分支

Git 学习指南&#xff08;三&#xff09;版本库与分支 五. 版本库5.1 一种简单而高效的存储系统5.2 存储目录&#xff1a;Blob与Tree5.3 相同数据只存储一次5.4 压缩相似内容5.5 不同文件散列值相同的情况5.6 提交对象5.7 提交历史中的对象宠用5.8 重命名、移动与复制 六. 分支…

golang学习笔记——切片

切片是数组或另一个切片之上的数据结构。 我们将源数组或切片称为基础数组。 通过切片&#xff0c;可访问整个基础数组&#xff0c;也可仅访问部分元素。 切片只有 3 个组件&#xff1a; 指向基础数组中第一个可访问元素的指针。 此元素不一定是数组的第一个元素 array[0]。切…

【WiFI问题自助】解决WiFi能连上但是没有网的问题

WiFi能连上但是没有网的问题 背景&#xff1a;wifi能连上&#xff0c;但是没有网 解决 遇事不决&#xff0c;先重启啊&#xff01;怎么重启&#xff1f;拔掉电源再插上&#xff01;拔掉网线再插上&#xff01; 直接ok了。 思考记录 今天WiFi又上不了网了&#xff0c;昨天报…

【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

文章目录 概要计算公式举个栗子实际应用小结 概要 透视变换&#xff08;Perspective Transformation&#xff09;是一种图像处理中常用的变换手段&#xff0c;它用于将图像从一个视角映射到另一个视角&#xff0c;常被称为投影映射。透视变换可以用于矫正图像中的透视畸变&…

MySQL高可用性:主从复制、读写分离与集群搭建

MySQL作为常用的关系型数据库管理系统&#xff0c;在构建高可用性解决方案上有着多种实践方法。本文将深入探讨MySQL的主从复制、读写分离以及集群搭建&#xff0c;为实现高可用性提供详细指南。 1. 主从复制&#xff08;Master-Slave Replication&#xff09; 1.1 什么是主从…

Jenkins 配置节点交换内存

查看交换内存 free -hswapon -s创建swap文件 dd if/dev/zero of/mnt/swap bs1M count1024启用交换文件 设置权限 chmod 600 /mnt/swap设置为交换空间 mkswap /mnt/swap启用交换 swapon /mnt/swap设置用户组 chown root:root /mnt/swap查看 swapon -s重启系统也能生效还需要修…

设计模式-行为型模式-模板方法模式

一、什么是模板模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个算法骨架&#xff0c;允许子类在不改变算法整体结构的情况下重新定义算法的某些步骤。 主要组成部分&#xff1a; 1、模板方法&#xff08;Templ…

JS解决跨域问题

在JavaScript中&#xff0c;解决跨域问题主要可以通过以下几种方法&#xff1a; JSONP (JSON with Padding)&#xff1a; JSONP 是通过在 DOM 中插入 <script> 标签&#xff0c;利用 script 标签的 src 属性不受同源策略限制的特性&#xff0c;实现跨域数据请求。示例&am…

论文笔记:Localizing Cell Towers fromCrowdsourced Measurements

2015 1 Intro 1.1 motivation opensignal.com 、cellmapper.net 和 opencellid.org 都是提供天线&#xff08;antenna&#xff09;位置的网站 他们提供的天线位置相当准确&#xff0c;但至少在大多数情况下不完全正确这个目标难以实现的原因是蜂窝网络供应商没有义务提供有…

.NET 使用配置文件

我简单测试了一下json格式配置文件&#xff0c;在这里记录一下&#xff0c;方便以后查看。 需要引用的库&#xff1a; Microsoft.Extensions.Hosting 创建json格式文件&#xff1a;appsettings.json 在工程文件中包含json文件&#xff1a; <ItemGroup><Content In…

面试题:数据库日期类型字段,需要兼容不同数据库,应该如何选择?

当设计一个产品&#xff0c;其中很多地方要把日期类型保存到数据库中&#xff0c;如果产品有兼容不同数据库产品的需求&#xff0c;那么&#xff0c;应当怎样设计呢&#xff1f; 当然&#xff0c;首先想到的是&#xff0c;使用数据库的 Date 或 DateTime 类型&#xff0c;可是…

wincc定时器功能介绍

1定时器功能介绍 WinCC中定时器的使用可以使WinCC按照指定的周期或者时间点去执行任务&#xff0c;比如周期执行变量归档、在指定的时间点执行全局脚本或条件满足时打印报表。WinCC已经提供了一些简单的定时器&#xff0c;可以满足大部分定时功能。但是在有些情况下&#xff0c…