23种设计模式之外观模式
目录
- 1. 简介
- 2. 代码
- 2.1 SelectFoodService (选择食品)
- 2.2 PayService (支付服务)
- 2.3 TakeService (制作服务)
- 2.4 OrderService (下单服务)
- 2.5 Food (食品)
- 2.6 TackingSystem (外观类)
- 2.7 Test (测试类)
- 3. 优缺点
- 3. 总结
1. 简介
外观模式是一种结构型设计模式。它为子系统中的一组接口提供了一个统一的高层接口,这个高层接口使得子系统更容易使用。就好像给一个复杂的机器(子系统)安装了一个简单的控制面板(外观类),用户通过操作这个控制面板就能轻松地使用机器的各种功能,而不需要了解机器内部复杂的结构和各个部件(子系统中的接口)是如何协同工作的。
例如,考虑一个计算机系统,它包含了 CPU、硬盘、内存等多个组件,每个组件都有自己复杂的操作接口。通过外观模式,可以创建一个 “计算机启动” 外观类,它内部封装了 CPU 初始化、硬盘加载系统文件、内存自检等操作。用户只需要调用 “计算机启动” 这个简单的操作,而不用去分别调用每个组件的复杂操作。
外观模式的结构组成
- 外观类(
Facade Class
)
这是外观模式的核心。外观类知道哪些子系统类负责处理请求,并将客户的请求代理给适当的子系统对象。它简化了与子系统的交互方式,对外提供了一个更加简单、统一的接口。例如,在上述计算机启动的例子中,“计算机启动” 类就是外观类。 - 子系统类(
Sub - system Classes
)
这些是实现具体功能的类,它们各自负责一个特定的、复杂的功能部分。在计算机系统中,CPU 类、硬盘类、内存类等都是子系统类。它们本身的操作可能很复杂,但外观类会对它们进行整合,使得用户不需要直接接触这些复杂的操作。
2. 代码
这里用点餐系统举例子。
2.1 SelectFoodService (选择食品)
public class SelectFoodService {public void select(String foodName){System.out.println("正在选择" + foodName + "。。。");}
}
2.2 PayService (支付服务)
public class PayService {public void pay(){System.out.println("正在支付。。。");}public boolean checkBanlance(){System.out.println("正在检查用户余额。。。");return true;}
}
2.3 TakeService (制作服务)
public class TakeService {public void taking(){System.out.println("正在制作外卖。。。");}
}
2.4 OrderService (下单服务)
public class OrderService {public void makeOrder(){System.out.println("正在下单。。。");}
}
2.5 Food (食品)
public class Food {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
2.6 TackingSystem (外观类)
public class TackingSystem {private SelectFoodService selectFoodService;private PayService payService;private OrderService orderService;private TakeService takeService;public TackingSystem(){selectFoodService = new SelectFoodService();payService = new PayService();orderService = new OrderService();takeService = new TakeService();}public void orderTacking(Food food){// 点餐selectFoodService.select(food.getName());// 校验余额boolean isPay = payService.checkBanlance();// 支付if(isPay){payService.pay();takeService.taking();orderService.makeOrder();}}
}
2.7 Test (测试类)
public class Test {public static void main(String[] args) {Food food = new Food();food.setName("西红柿鸡蛋面");TackingSystem tackingSystem = new TackingSystem();tackingSystem.orderTacking(food);}
}
输出结果:
正在选择西红柿鸡蛋面。。。
正在检查用户余额。。。
正在支付。。。
正在制作外卖。。。
正在下单。。。
3. 优缺点
外观模式的优点
- 简化接口
为复杂的子系统提供了一个简单的、统一的接口,降低了客户端与子系统之间的耦合度。客户端只需要和外观类交互,不需要了解子系统内部的复杂细节,就像在家庭影院系统中,用户只需要通过外观类的 “watchMovie” 和 “endMovie” 方法就能轻松控制整个系统,而不用分别去操作每个设备。 - 提高可维护性和可扩展性
当子系统内部的结构和功能发生变化时,只要外观类的接口保持不变,客户端代码就不需要修改。例如,如果要升级 DVD 播放器的内部软件,只要它的 “turnOn” 和 “turnOff” 接口不变,外观类和客户端代码都不需要调整。同时,新的子系统可以很容易地添加到外观类中,方便系统的扩展。 - 实现了层次隔离
外观模式可以将系统的高层逻辑和底层实现分离开来。高层逻辑通过外观类来体现,底层的子系统则负责具体的功能实现。这种层次隔离使得代码的结构更加清晰,便于不同层次的开发人员分别进行开发和维护。
外观模式的缺点
- 不符合开闭原则的潜在风险
如果外观类的接口需要修改,可能会影响到所有使用该外观类的客户端。因为外观类是客户端和子系统之间的桥梁,一旦这个桥梁的接口发生变化,就可能需要修改客户端代码。例如,如果要在家庭影院系统的外观类中添加一个新的功能,如 “暂停电影”,那么所有使用这个外观类的客户端代码可能都需要相应地修改,这在一定程度上不符合开闭原则(对扩展开放,对修改关闭)。 - 外观类可能会变得过于复杂
如果子系统本身非常庞大和复杂,外观类需要整合大量的子系统接口,那么外观类可能会变得臃肿和复杂。这可能会导致外观类的维护成本增加,而且可能会降低代码的可读性。例如,一个大型企业级软件系统的外观类,如果要整合众多的子系统,如数据库管理系统、消息队列系统、文件存储系统等,外观类的代码可能会变得非常复杂。
3. 总结
其实就是定义多个子系统,一个总系统,随后总系统初始化多个子系统,然后使用就行了。
相关文章:
23种设计模式之外观模式
目录 1. 简介2. 代码2.1 SelectFoodService (选择食品)2.2 PayService (支付服务)2.3 TakeService (制作服务)2.4 OrderService (下单服务)2.5 Food (食品)2.6 TackingSystem (外观类)2.7 Test (测试类) 3. 优缺点3. 总结 1. 简介…...

GateWay使用手册
好的,下面是优化后的版本。为了提高可读性和规范性,我对内容进行了结构化、简化了部分代码,同时增加了注释说明,便于理解。 1. 引入依赖 在 pom.xml 中添加以下依赖: <dependencies><!-- Spring Cloud Gate…...
MySQL1.0
1.数据库的三大范式 范式是为了使数据库设计更加合理,规范,减少数据冗余和数据不一致等问题指定的一系列规则。 第一范式:第一范式要求数据表中的每一列都是不可分割的原子数据项。例如:有一个学生信息表,包含 “学生…...

IDEA使用HotSwapHelper进行热部署
目录 前言JDK1.8特殊准备DECVM安装插件安装与配置参考文档相关下载 前言 碰到了一个项目,用jrebel启动项目时一直报错,不用jrebel时又没问题,找不到原因,又不想放弃热部署功能 因此思考能否通过其他方式进行热部署,找…...
简单web项目自定义部署Dockerfile
本意就是弄清楚如何做web自定义项目的镜像。 基础镜像是java:8u261-jdk,其中java路径为/opt/java webdemo1.0.0.1-SNAPSHOT.jar文件里面已经包含了lib文件。 可以设置PATH也可以不设置,但是建议设置JAVA_HOME FROM swr.cn-north-4.myhuaweicloud.com…...

基础Web安全|SQL注入
基础Web安全 URI Uniform Resource Identifier,统一资源标识符,用来唯一的标识一个资源。 URL Uniform Resource Locator,统一资源定位器,一种具体的URI,可以标识一个资源,并且指明了如何定位这个资源…...
SpringBoot -拦截器Interceptor、过滤器 Filter 及设置
Spring Boot拦截器(Interceptor)的概念 - 在Spring Boot中,拦截器是一种AOP的实现方式。它主要用于<font style"color:#DF2A3F;">拦截请求</font>,在请求处理之前和之后执行特定的代码逻辑。与过滤器不同的…...

C++小问题
怎么分辨const修饰的是谁 是限定谁不能被改变的? 在C中,const关键字的用途和位置非常关键,它决定了谁不能被修改。const可以修饰变量、指针、引用等不同的对象,并且具体的作用取决于const的修饰位置。理解const的规则能够帮助我们…...
avcodec_alloc_context3,avcodec_open2,avcodec_free_context,avcodec_close
avcodec_alloc_context3 是创建编解码器上下文,需要使用 avcodec_free_context释放 需要使用avcodec_free_context 释放 /** * Allocate an AVCodecContext and set its fields to default values. The * resulting struct should be freed with avcodec_free_co…...

强化学习的几个主要方法(策略梯度、PPO、REINFORCE实现等)(下)
由于平台字数限制,上文:https://blog.csdn.net/ooblack/article/details/144198538 4. PPO算法 近端策略优化(proximal policy optimization,PPO)算法是OpenAI的默认强化学习算法,在RLHF中也用到了这个算…...

计算机网络:IP协议详细讲解
目录 前言 一、IP网段划分 二、IP报头 三、解决IP地址不足-->NAT技术 前言 在之前,我们学习了传输层中的TCP和UDP,重点是TCP协议,他帮我们解决具体到主机的哪个应用(端口)、传输的可靠(序列号、校验和…...

2024信创数据库TOP30之华为Gauss DB
近日,由DBC联合CIW/CIS共同发布的“2024信创数据库TOP30”榜单正式揭晓,汇聚了国内顶尖的数据库企业及其产品,成为展示中国信创领域技术实力与发展潜力的重要平台。在这份榜单中,华为的GaussDB凭借其卓越的技术实力、广泛的行业应…...

在线家具商城基于 SpringBoot:设计模式与实现方法探究
第3章 系统分析 用户的需求以及与本系统相似的在市场上存在的其它系统可以作为系统分析中参考的资料,分析人员可以根据这些信息确定出本系统具备的功能,分析出本系统具备的性能等内容。 3.1可行性分析 尽管系统是根据用户的要求进行制作,但是…...
九、Spring Boot集成Spring Security之授权概述
文章目录 往期回顾:Spring Boot集成Spring Security专栏及各章节快捷入口前言一、授权概述二、用户权限三、用户授权流程三、Spring Security授权方式1、请求级别授权2、方法级别授权 往期回顾:Spring Boot集成Spring Security专栏及各章节快捷入口 Spr…...
python之Flask入门—路由参数
语法: /routerName/<string:parameter_name> 其中:routerName代表路由名称<>中的string是参数类型,parameter_name为参数名称 参数类型: (1) string 接收任何没有斜杠(/&#x…...
txt地图格式处理
1、txt地图格式 [属性描述] 坐标系2000国家大地坐标系 几度分带3 投影类型高斯克吕格 计量单位米 带号38 精度0.001 转换参数,,,,,, [地块坐标] 5,475.888,1,测试地块1,面,J50G077061,公路用地,地下, J1,1,113.22222222222222,23.129111721551794 J2,1,113.2722314…...

《数据挖掘:概念、模型、方法与算法(第三版)》
嘿,数据挖掘的小伙伴们!今天我要给你们介绍一本超级实用的书——《数据挖掘:概念、模型、方法与算法》第三版。这本书是数据挖掘领域的经典之作,由该领域的知名专家编写,系统性地介绍了在高维数据空间中分析和提取大量…...
GitLab CVE-2024-8114 漏洞解决方案
漏洞 ID 标题严重等级CVE ID通过 LFS 令牌提升权限高CVE-2024-8114 GitLab 升级指南GitLab 升级路径查看版本漏洞查询 漏洞解读 此漏洞允许攻击者使用受害者的个人访问令牌(PAT)进行权限提升。影响从 8.12 开始到 17.4.5 之前的所有版本、从 17.5 开…...
request和websocket
当然,可以为你详细介绍 FastAPI 中的 Request 对象。Request 对象在 FastAPI 中扮演着重要的角色,负责封装来自客户端的 HTTP 请求信息。了解 Request 对象的使用方法和属性,有助于你更高效地处理请求数据、访问请求上下文以及进行各种操作。…...

一键生成后端服务,MemFire Cloud重新定义开发效率
作为开发者,特别是独立开发者和小团队成员,大家都知道开发的最大难题之一就是搭建后端服务。要让一个应用从零开始,除了前端的开发工作外,还需要考虑数据库、接口、认证、存储等等一系列繁琐的后台工作。而MemFire Cloud这款神器&…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...