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

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

文章目录

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

概念

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

结构

在这里插入图片描述

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、违背开闭原则,有新的子系统加入需要修改外观类。

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

相关文章:

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

文章目录 概念结构实例总结 概念 外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 外观模式引入了一个新的外观类,它为多个业务类的调用提供了一个统一的入口。主要优点…...

leetcode:520. 检测大写字母

一、题目: 链接:520. 检测大写字母 - 力扣(LeetCode) 函数原型:bool detectCapitalUse(char* word) 二、思路: 本题较为简单,分为三种情况: 1.首字母大写,其余小写 2.首字…...

5-6求1-20的阶乘和

#include<stdio.h> //求阶乘 int main(){int n;double sum0;//求和&#xff1a;一点一点加int t1;for (n1;n<15;n){tt*n;sumsumt;}printf("结果是&#xff1a;%22.15e \n",sum);return 0; }为啥最后是%22.15e呢&#xff1f; 因为这个求和的结果太大了 所以转…...

web需求记录

需求1&#xff1a;根据后端传过来的设备名:DESKTOP-4DQRGQB&#xff0c;以及mac:e0:be:03:74:40:0b&#xff1b;iQOO-8&#xff0c;mac:b0:33:66:38:c3:25&#xff0c;用web option 是动态增加的&#xff08;也就是那个选择框里面的东西是根据后端传过来的值动态增加的&#xf…...

[网鼎杯 2018]Fakebook

[网鼎杯 2018]Fakebook 打开环境出现一个登录注册的页面 在登录和注册中发现 了地址栏出现变化&#xff0c;扫一波看看 看看robots.txt和flag.php 访问robots.txt看看 再访问user.php.bak <?php class UserInfo { public $name ""; public …...

微信小程序蓝牙连接 uniApp蓝牙连接设备

蓝牙列表期待效果 代码 <template><view class"bluetooth-list"><view class"align-items option" style"justify-content: space-between;" v-for"item in bluetoothList" :key"item.deviceId"><vie…...

启动Dubbo项目注册Zookeeper时提示zookeeper not connected异常原理解析

原创/朱季谦 遇到一个很诡异的问题&#xff0c;我在启动多个配置相同zookeeper的Dubbo项目时&#xff0c;其他项目都是正常启动&#xff0c;唯独有一个项目在启动过程中&#xff0c;Dubbo注册zookeeper协议时&#xff0c;竟然出现了这样的异常提示—— Caused by: java.lang.…...

我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine&#xff1a;使用仿射变换矩阵对图像进行变换&#xff0c;可以实现平移、缩放和旋转等操作。cv2.warpPerspective&#xff1a;使用透视变换矩阵对图像进行透视变换&#xff0c;可以实现镜头校正、图像纠偏等…...

MATLAB算法实战应用案例精讲-【图像处理】图像缩放

目录 前言 知识储备 MATLAB图像处理函数 数字数字图像增强 数字数字图像的变换...

Doris的PROPERTIES与ENGINE(九)

接上篇----------Doris分区与分桶 在建表语句的最后 PROPERTIES 中&#xff0c;可以指定以下两个参数&#xff1a; replication_num 每个 Tablet 的副本数量。默认为 3&#xff0c;建议保持默认即可。在建表语句中&#xff0c;所有 Partition 中的 Tablet 副本数量统一指定。…...

华为云数据库 RDS 下载全量备份文件 wget

地址下载 wget -O FILE_NAME --no-check-certificate "DOWNLOAD_URL"FILE_NAME&#xff1a;重命名&#xff0c;例如mysql1121.qpDOWNLOAD_URL: 地址下载 参考 华为云数据库 RDS 下载全量备份文件...

C#使用whisper.net实现语音识别(语音转文本)

目录 介绍 效果 输出信息 项目 代码 下载 介绍 github地址&#xff1a;https://github.com/sandrohanea/whisper.net Whisper.net. Speech to text made simple using Whisper Models 模型下载地址&#xff1a;https://huggingface.co/sandrohanea/whisper.net/tree…...

从零开始学习typescript——运算符(算术运算符、赋值运算符、比较运算符)

算术运算符 算术运算符主要是针对数值类型和长整型&#xff1b;包括有加法、减法、乘法、除法、自增、自减等运算 加法&#xff08;&#xff09; let x:number1let y:number 2console.log(xy)减法&#xff08;-&#xff09; let x:number1let y:number 2console.log(y-x)乘法…...

likeshop单商户商城系统 任意文件上传漏洞复现

0x01 产品简介 likeshop单商户标准商城系统适用于B2C、单商户、自营商城场景。完美契合私域流量变现闭环交易使用。 系统拥有丰富的营销玩法&#xff0c;强大的分销能力&#xff0c;支持电子面单和小程序直播等功能。无论运营还是二开都是性价比极高的100%开源商城系统。 0x02…...

CentOS 7 使用pugixml 库

安装 pugixml Git下载地址&#xff1a;https://github.com/zeux/pugixml 步骤1&#xff1a;首先&#xff0c;你需要下载pugixml 的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2&#xff1a;下载完成后&#xff0c;需要将源代码解压…...

深度学习 loss 是nan的可能原因

1 loss 损失值非常大&#xff0c;超过了浮点数的范围&#xff0c;所以表示为overflow 状态下的男。 解决办法&#xff1a; 减小学习率&#xff0c;观察loss值是不是还是nan 在将数据输入模型前&#xff0c;进行恰当的归一化 缩放 2 loss 的计算中存在除以0&#xff0c; log(0…...

[ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务

本文收录于【#云计算入门与实践 - AWS】专栏中&#xff0c;收录 AWS 入门与实践相关博文。 本文同步于个人公众号&#xff1a;【云计算洞察】 更多关于云计算技术内容敬请关注&#xff1a;CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文&#xff1a; [ 云计算 | …...

第二十章:多线程

进程 线程的特点 1.进程是资源分配的最小单位&#xff0c;线程是最小的执行单位 2.一个进程可以有多个线程 3.线程共享进程资源 package twentyth; public class ThreadTest extends Thread { public void run() { for (int i 1; i < 10; i) {//继承重…...

CentOS 7启动时报“Started Crash recovery kernel arming.....shutdown....”问题处理过程

有台虚拟机由于CPU负载过高而宕机&#xff0c;宕机重启后停在“Started Crash recovery kernel arming…shutdown…”阶段&#xff0c;如下所示&#xff1a; 重置虚拟机&#xff0c;进入grub菜单&#xff0c;按e编辑启动选项&#xff0c;在linux16 行末&#xff0c;加上&…...

Android 13 - Media框架(14)- OpenMax(二)

这一节我们将来解析 media.codec 这个 HIDL service 究竟提供了什么服务&#xff0c;服务是如何启动的。 1、main 函数 我们先来看 frameworks/av/services/mediacodec/main_codecservice.cpp&#xff1a; int main(int argc __unused, char** argv) {strcpy(argv[0], "…...

ComfyUI Impact Pack终极指南:5个高效技巧解锁AI图像增强的强大功能

ComfyUI Impact Pack终极指南&#xff1a;5个高效技巧解锁AI图像增强的强大功能 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地…...

Nexu:开发环境即代码,实现团队开发环境标准化与一键部署

1. 项目概述&#xff1a;从零到一理解Nexu最近在开源社区里&#xff0c;一个名为“nexu-io/nexu”的项目引起了我的注意。乍一看这个标题&#xff0c;你可能会有点摸不着头脑&#xff1a;这到底是做什么的&#xff1f;是某种新的开发框架&#xff0c;还是一个工具链&#xff1f…...

暗黑3终极按键助手:D3KeyHelper免费完整使用指南

暗黑3终极按键助手&#xff1a;D3KeyHelper免费完整使用指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 你是否在暗黑破坏神3的高强度刷图中感到…...

避开这些坑!在Proteus中仿真运放电路时,新手最常遇到的3个问题及解决方法

避开这些坑&#xff01;在Proteus中仿真运放电路时&#xff0c;新手最常遇到的3个问题及解决方法 刚接触Proteus进行运放电路仿真的朋友&#xff0c;一定遇到过这样的困惑&#xff1a;明明电路连接和教科书上一模一样&#xff0c;仿真结果却和理论值相差甚远&#xff1b;或者仿…...

2026届最火的AI辅助写作网站解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 现有的人工智能内容方面的检测的系统如今已然能够以高效的状态去识别由机器所生成的文本。要…...

Python国密性能天花板被打破:自研PySM加速引擎实测达OpenSSL国密分支1.92倍,源码仅开放72小时

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Python国密算法性能瓶颈与突破意义 国密算法&#xff08;SM2/SM3/SM4&#xff09;作为我国商用密码体系的核心&#xff0c;已在政务、金融、物联网等关键领域全面推广。然而&#xff0c;在 Python 生态…...

对比使用 Taotoken 前后在多模型管理与账单整合上的效率提升

对比使用 Taotoken 前后在多模型管理与账单整合上的效率提升 1. 多模型接入的复杂度变化 在对接多个大模型厂商时&#xff0c;开发者通常需要为每个供应商单独申请 API Key&#xff0c;并维护不同的接入端点。以常见的 OpenAI 和 Anthropic 兼容模型为例&#xff0c;传统方式…...

AI技能库:从人类行为数据中提炼财富信号的实战指南

1. 项目概述&#xff1a;从数据噪音中淘金的AI技能库如果你和我一样&#xff0c;每天被淹没在无数的聊天记录、会议纪要、社交媒体动态和消费数据里&#xff0c;感觉信息过载却抓不住重点&#xff0c;那么这个名为“Awesome Golden Touch Skills”的项目&#xff0c;可能会给你…...

CefFlashBrowser终极指南:在Windows上完美重温经典Flash游戏

CefFlashBrowser终极指南&#xff1a;在Windows上完美重温经典Flash游戏 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser CefFlashBrowser是一款专为Windows用户设计的Flash浏览器&#xf…...

如何用League Director制作专业级《英雄联盟》高光集锦:5步完整指南

如何用League Director制作专业级《英雄联盟》高光集锦&#xff1a;5步完整指南 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leaguedirector…...