小谈设计模式(13)—外观模式

小谈设计模式(13)—外观模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 外观模式
    • 主要目的
    • 角色分析
      • 外观(Facade)角色
      • 子系统(Subsystem)角色
      • 客户端(Client)角色
    • 工作原理
    • 核心思想总结
      • 简化接口
      • 解耦客户端和子系统
      • 隐藏实现细节
    • Java程序实现
      • 程序分析
    • 优缺点分析
      • 优点
        • 简化客户端的操作
        • 解耦客户端和子系统
        • 提高系统的可用性和可维护性
      • 缺点
        • 可能导致系统变得更加复杂
        • 限制了灵活性
    • 总结

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

外观模式

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式定义了一个高层接口,使得子系统更容易使用。

主要目的

简化复杂系统的接口。它通过提供一个统一的接口,隐藏了子系统的复杂性,使得客户端可以更方便地使用系统。外观模式通过将客户端与子系统解耦,提供了一个简化的接口,从而降低了系统的复杂性。
在这里插入图片描述

角色分析

外观(Facade)角色

外观角色是外观模式的核心。它知道哪些子系统类负责处理请求,并将客户端的请求委派给适当的子系统对象。外观角色通常是单例模式,可以提供一个简单的接口,隐藏了子系统的复杂性。

子系统(Subsystem)角色

子系统角色是外观模式中的各个子系统类。它们是实际处理请求的类,完成具体的功能。外观角色将客户端的请求委派给适当的子系统对象,由子系统对象完成具体的操作。

客户端(Client)角色

客户端角色是使用外观模式的类。它通过调用外观角色的接口来完成操作,而不需要直接与子系统类交互。客户端角色只需要知道外观角色提供的简单接口,无需了解子系统的复杂性。

在这里插入图片描述

工作原理

客户端通过调用外观角色的接口来进行操作,外观角色将请求委派给适当的子系统对象,子系统对象完成具体的操作并返回结果给客户端。客户端无需了解子系统的复杂性,只需要通过外观角色来访问子系统。这样可以降低系统的复杂性,提高系统的可维护性和可扩展性。

核心思想总结

简化接口

外观角色提供了一个简化的接口,将子系统的一组接口封装起来,使得客户端可以更方便地使用系统。客户端只需要调用外观角色的接口,无需了解子系统的复杂性。

解耦客户端和子系统

外观模式将客户端与子系统解耦,客户端只需要与外观角色交互,而不需要直接与子系统类交互。这样可以降低客户端的复杂性,同时也提高了系统的可维护性和可扩展性。

隐藏实现细节

外观模式将子系统的实现细节隐藏起来,只暴露给客户端一个简单的接口。这样可以保护子系统的实现细节,防止客户端直接访问和修改子系统的内部实现。
在这里插入图片描述

Java程序实现

// 子系统类A
class SubsystemA {public void operationA() {System.out.println("SubsystemA operation");}
}// 子系统类B
class SubsystemB {public void operationB() {System.out.println("SubsystemB operation");}
}// 外观类
class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();}public void operation() {subsystemA.operationA();subsystemB.operationB();}
}// 客户端类
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.operation();}
}

程序分析

在上面的示例中,我们定义了两个子系统类 SubsystemA 和 SubsystemB,它们分别实现了不同的操作。然后我们定义了一个外观类 Facade,它将子系统类封装起来,并提供了一个简化的接口 operation。客户端类 Client 使用外观类来完成操作,而不需要直接与子系统类交互。
在这里插入图片描述

优缺点分析

优点

简化客户端的操作

外观模式提供了一个简化的接口,隐藏了子系统的复杂性,使客户端更容易使用。

解耦客户端和子系统

外观模式将客户端与子系统解耦,客户端只需要与外观类进行交互,不需要直接与子系统类交互,降低了客户端的复杂性。

提高系统的可用性和可维护性

外观模式将子系统的实现细节封装起来,保护了子系统的实现细节,使系统更加稳定和可维护。
在这里插入图片描述

缺点

可能导致系统变得更加复杂

当系统变得复杂时,外观类可能会变得庞大,难以维护。

限制了灵活性

外观模式隐藏了子系统的复杂性,但也限制了客户端对子系统的灵活访问。

总结

外观模式在简化客户端操作、解耦客户端和子系统、提高系统可用性和可维护性方面具有很大的优势,适用于需要隐藏复杂子系统的情况。但需要注意在设计时避免外观类变得庞大和过于复杂,以及权衡灵活性和封装性。在这里插入图片描述

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

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

相关文章

vs code 离线安装 CodeLLDB 包[Acquiring CodeLLDB platform package]

1. 问题描述 最近在配置使用vscode编译c,一打开vscode就弹出以下信息“Acquiring CodeLLDB platform package” 2. 问题原因 vscode在安装CodeLLDB插件时,速度太慢,一直不能成功 3. 解决方案: 离线下载 CodeLLDB插件&#xff0c…

深度学习笔记之微积分及绘图

深度学习笔记之微积分及绘图 学习资料来源:微积分 %matplotlib inline from matplotlib_inline import backend_inline from mxnet import np, npx from d2l import mxnet as d2lnpx.set_np()def f(x):return 3 * x ** 2 - 4 * xdef numerical_lim(f, x, h):retur…

华为云云耀云服务器L实例评测 | 实例使用教学之简单使用:通过部署宝塔面板可视化管理华为云云耀云服务器

华为云云耀云服务器L实例评测 | 实例使用教学之简单使用:通过部署宝塔面板可视化管理华为云云耀云服务器 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为…

input允许多行输入

input允许多行输入 input允许多行输入 ______________________________ 表示停止输入想象一下,我们现在身处一间充满活力的课堂。学生们坐在自己的座位上,准备聆听老师的讲解。老师站在讲台上,充满激情地开始教授代码。 老师:同…

“入门C++编程需要多长时间?如何高效学习?“

文章目录 每日一句正能量前言一、c 发展方向二、学c语言编程难吗?三、多久能学会编程?四、“浸泡”理论五、C语言特有特性六、学习方式后记 每日一句正能量 低头要有勇气,抬头要有底气。做人要能屈能伸,顺景时不嚣张,逆…

【Unity2022】Unity实现手机游戏操控摇杆(实现操控轮盘)

文章目录 运行效果预览创建物体脚本获取RectTransform处理玩家拖动事件完整代码 获取输入运行其他文章 运行效果预览 首先展示一下本文章实现的效果: 创建物体 创建两个UI图像,一个用于表示背景,作为父物体,命名为JoyStick&am…

基于SpringBoot的补习班线上报名系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

十四天学会C++之第一天(入门和基本语法)

C的起源和历史 C诞生于20世纪80年代初,它的创造者是计算机科学家Bjarne Stroustrup。当时,Stroustrup在贝尔实验室工作,他希望为C语言添加一些功能,以便更好地支持系统开发。这个愿望促使他创建了C。 C的名字来源于它的基因&…

Nginx实现动静分离

一、概述 1、什么是动静分离 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。 动静分离简单的概…

基于C++ Qt的积分抽奖系统源码,实现了用户注册、商品购买、积分抽奖等功能

基本介绍 完整代码下载:基于C Qt的积分抽奖系统 这个是我大二上学期的课程作业仓库, 目的是实现一个超市积分抽奖系统, 基本的功能是实现一个能够在超市购物的同时进行抽奖的积分系统, 主要用到的技术栈就是Qt和c, 叠…

火山引擎 ByteHouse 与白鲸开源完成兼容性认证,加速数据价值释放

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 数据作为新型生产要素,已快速融入生产、分配、流通、消费和社会服务管理等各环节,深刻改变着生产方式、生活方式和治理方式。越来越多企业也…

Hive【Hive(五)函数-高级聚合函数、炸裂函数】

高级聚合函数 多进一出(多行输入,一个输出) 普通聚合函数:count、sum ... 1)collect_list():收集并形成 list 集合,结果不去重 select sex,collect_list(job) from e…

JAVA学习(3)-全网最详细~

回顾 昨天学了 Java 中的数据类型-整型 int - integer,以及什么是标识符identifier和它的命名规则,什么是保留字(reserved word key word),最后还谈到了Java变量包括局部变量和成员变量(在类内部,方法外部的变量),变量必须要初始化,否则会报错.如果有遗忘或者是感兴趣的小伙伴…

Python PEP8 代码规范常见问题及解决方案

Win11查看安装的Python路径及安装的库 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python PEP8 代码规范常见问题及解决方案 Python3操作MySQL8.XX创建表|CRUD基本操作 Python3操作SQLite3创建表主键自增长|CRUD基本操作 anac…

ESLint自动修复代码规范错误

基于 vscode 插件 ESLint 高亮错误,并通过配置 自动 帮助我们修复错误 在设置中 settings.json添加这段代码就自动修复错误 // 当保存的时候,eslint自动帮我们修复错误 "editor.codeActionsOnSave": { "source.fixAll": true }, /…

Ubuntu安装samba服务器

为了window系统下能够像访问本地目录一样访问ubuntu系统下的目录,这里我通过安装samba服务器,将ubuntu系统的文件目录通过网络挂载的方式共享出来,以便在window下就能够对ubuntu系统的文件进行读写等访问操作,这里记录一下samba服…

HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题

目录 一、GET与POST简介 二、空行和body 三、初识请求报头以及粘包问题 四、认识请求报头剩余部分 一、GET与POST简介 GET https://www.sogou.com/HTTP/1.1 请求报文中的方法,是最常规的方法(获取资源) POST:传输实体主体的方法…

插入排序:简单而有效的排序方法

在计算机科学中,排序算法是一个重要且常见的主题,它们用于对数据进行有序排列。插入排序(Insertion Sort)是其中一个简单但有效的排序算法。本文将详细解释插入排序的原理和步骤,并提供Java语言的实现示例。 插入排序的…

systrace/perfetto抓取方式分享

背景 近来有一些同学反馈性能分析,现在大部分都是其实已经开始使用perfetto了,连sdk上都已经找不到哦systrace相关工具,让马哥可以分享一些这个相关内容,其实以前企业里面那时候大部分都是使用老版本systrace的,相比新…

sheng的学习笔记-【中文】【吴恩达课后测验】Course 1 - 神经网络和深度学习 - 第二周测验

课程1_第2周_测验题 目录:目录 第一题 1.神经元计算什么? A. 【  】神经元计算激活函数后,再计算线性函数(zWxb) B. 【  】神经元计算一个线性函数(zWxb),然后接一个激活函数…