设计模式学习[10]---迪米特法则+外观模式

文章目录

  • 前言
  • 1. 迪米特法则
  • 2. 外观模式
    • 2.1 原理阐述
    • 2.2 举例说明
  • 总结

前言

之前有写到过 依赖倒置原则,这篇博客中涉及到的迪米特法则和外观模式更像是这个依赖倒置原则的一个拓展。

设计模式的原则嘛,总归还是高内聚低耦合,下面就来阐述一下本篇文章的法则与模式

1. 迪米特法则

迪米特法则(LoD):如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

说人话:如果我和你之间没必要面对面说话,那我和你之间就没必要接触。如果哪一天我要和你说话,我通过一个第三方媒介来找你。

比如我们看博客,我们找我们想看的文章,我们其实和作者之间根本不会有任何接触,我们只是想看一下文章,同时我们也不会面对面和作者聊。但是如果我们遇到问题了,我们想和作者聊,沟通具体实现细节,没看懂博客的地方等等,这时候就需要平台这个媒介充当第三者,来转发我们的沟通。

这个在设计模式里面,其实就是遵循依赖倒置的原则的一种体现。第三方媒介其实就是一个接口,负责连接双方的沟通。把我们偶发的有需要的直接通信,用平台隔开,这样读者和作者两个类就不会耦合太深。

2. 外观模式

2.1 原理阐述

外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

说人话:把一系列的子系统的接口用一个高层接口去封装,别人用这个接口就可以调用子系统里面的一些组合功能。
简单举例:
炒股里面,你可以单买一只股票,也可以买基金。两者的区别就在于,基金包括了十几只股票,而你买股票一般一次买一只。
你买了股票还要看这只股票的各种影响因素,对于你来说,你是对这个股票对象进行了直接联系,耦合度很高。
但如果你买基金,由基金经理人用这些钱去投资,然后大家获利。对于你来说,你只需要考虑买哪个基金,而不用考虑那么多的股票,因为基金里面就包含了很多股票。那你对这个股票是不是降低了耦合?

基金是不是就相当于是一个高层接口?你买基金实际上就是买了股票。对于这个投资系统来说,你通过基金这个高层接口,使用了它的子系统:股票。这个基金就相当于是一堆股票的壳,也就是外观。

2.2 举例说明

上面简单说了个股票与基金的例子,那么下面再举一个游戏中的例子。

最近在玩《黑神话·悟空》,当了回天命人,天天命中注定被揍的人。

玩这种3A大作,非常的吃电脑配置。我们想要游戏有非常好的体验,画质,音效,帧率都很重要。
在玩游戏前我们一般都要对这几项进行设置,一般设置有两种方式,一种是默认配置低、中、高、极高等,还有一种是自定义各个属性。这里前一种就像我们刚才提到的基金,后一种就是股票。
先看段代码:

//现在有两个类
class CGraphic
{
public:
	void setResolution(){};//设置分辨率
	void setFullScreen(){};//设置是否全屏
	void setTextureQuality(){};//设置贴图质量
	void setAntiAliasing(){};//设置抗锯齿
	...
};
class CColor
{
public:
	void setColorblindnessPattern(){};//设置色盲模式
	void setBright(){};//设置明亮度
	....
};
class CSound
{
	void setVolumn(){};//设置音量大小
	void setBackgroundVolumn(){};//设置背景音效
	void setEnvironmentVolumn(){};//设置环境音效
	...
};

这里简单写了三个类,我们一般调整画质涉及到分辨率,窗口化,贴图质量等;颜色会涉及到明亮度,色盲模式;声音有总音量,背景音效,环境音效等。

对于初次玩游戏的玩家来说,很多参数都不知道什么意思(我这里写的几个参数比较简单),比如各向异性这种专业名词,要设置的话更不知道有什么效果了。对于新手玩家来说,有一个非常简单的预设可以一键设置就会好很多。

这时候外观模式就上场了,用一个统一的全局设置–>低、中、高、极高。玩家只需要切换这四种预设,那么里面的画质,颜色,声音都会自动配置好,极大的提升了用户体验。用户不用管用里面细节的具体参数设置。

用代码包一层大概如下:

Class GeneralSetting
{
publicvoid setImageQuality()
	{
		m_g.setResolution(){};//设置分辨率
		m_g.setFullScreen(){};//设置是否全屏
		m_g.setTextureQuality(){};//设置贴图质量
		m_g.setAntiAliasing(){};//设置抗锯齿
		
		m_c.setColorblindnessPattern(){};//设置色盲模式
		m_c.setBright(){};//设置明亮度
		
		m_s.setVolumn(){};//设置音量大小
		m_s.setBackgroundVolumn(){};//设置背景音效
		m_s.setEnvironmentVolumn(){};//设置环境音效

	}
private:
	CGraphic m_g;//图像
	CColor m_c;//颜色
	Csound m_s;//声音
};

这里我们通过一个函数setImageQuality即可将几个相关类的所有参数设置好。这里代码部分比较伪代码,其实还应该有,低中高极高四种情况的一个传参。

当然了外观模式的重点不在这里,重点在于能否用这么一个统一的接口将所有的子类管理起来,使得界面一致,子类更方便使用。

外观模式结构图:
在这里插入图片描述

总结

迪米特法则也好,外观模式也罢。总而言之就是把一些不相关的类,用一个高层接口,包一层,管理起来,一起调用。
做到接口统一,类与类之间高内聚低耦合。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【看海的算法日记✨优选篇✨】第三回:二分之妙,寻径中道

🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 一念既出,万山无阻 目录 📖一、算法思想 细节问题 📚左右临界 📚中点选择 📚…

使用Canal将MySQL数据同步到ES(Linux)

一、Canal官网文档 去到官方文档根据官网文档进行操作: QuickStart alibaba/canal Wiki GitHub 二、开启服务器中MySQL的binlog [mysqld] log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server_id1 # 配置 MySQL replaction 需要定义&#x…

CENet及多模态情感计算实战

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

基于深度学习和卷积神经网络的乳腺癌影像自动化诊断系统(PyQt5界面+数据集+训练代码)

乳腺癌是全球女性中最常见的恶性肿瘤之一,早期准确诊断对于提高生存率具有至关重要的意义。传统的乳腺癌诊断方法依赖于放射科医生的经验,然而,由于影像分析的复杂性和人类判断的局限性,准确率和一致性仍存在挑战。近年来&#xf…

【热门主题】000074 深度学习模型:探索与应用

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

MacOS使用VSCode编写C++程序如何配置clang编译环境

前言 这段时间在练习写C和Python,用vscode这个开发工具,调试的时候遇到一些麻烦,浪费了很多时间,因此整理了这个文档。将详细的细节描述清楚,避免与我遇到同样问题的人踩坑。 1.开发环境的配置 vscode的开发环境配置…

Scala关于成绩的常规操作

score.txt中的数据: 姓名,语文,数学,英语 张伟,87,92,88 李娜,90,85,95 王强,78,90,82 赵敏,92,8…

【实战】在Koa.js中实现文件上传的接口 (本地存储)

目录 环境准备 使用 koa-body 中间件获取上传的文件 使用 Postman 测试 使用 koa-static 中间件生成图片链接 编写前端页面上传文件 文件上传是一个基本的功能,每个系统几乎都会有,比如上传图片、上传Excel等。那么在Node Koa应用中如何实现一个支持…

使用html语言完成拼多多移动端导航栏的设计-大连东软信息学院计算机科学与技术专业高级网页设计基础课题

目录 前言 一、效果图 二、图标的使用 三、代码的编写 四、运行效果 五、文档编写 前言 1.本文所讲内容来自辽宁大连东软信息学院计算机与技术专业高级网页设计(专升本)课程期中四级项目课题之一,题目要求是自主选择相应的APP移动端&…

从语法、功能、社区和使用场景来比较 Sass 和 LESS

一:可以从语法、功能、社区和使用场景来比较 Sass 和 LESS: 1:语法 原始的 Sass 采用的是缩进而不是大括号,后续的 Sass 版本与 LESS 一样使用与 CSS 类似的语法: address {.fa.fa-mobile-phone {margin: 0 3px 0 2…

7. 现代卷积神经网络

文章目录 7.1. 深度卷积神经网络(AlexNet)7.2. 使用块的网络(VGG)7.3. 网络中的网络(NiN)7.4. 含并行连结的网络(GoogLeNet)7.5. 批量规范化7.5.1. 训练深层网络7.5.2. 批量规范化层…

sqlmap详细使用

SQLmap使用详解 SQLmap(常规)使用步骤 1、查询注入点 python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id12、查询所有数据库 python sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id1 --dbs3、查询当前数据库 python sqlmap.py -u htt…

React+TS+css in js 练习

今天分享的内容是动态规划的经典问题--0-1 背包问题 0-1背包问题的描述如下:给定一组物品,每种物品都有自己的重量和价值,背包的总容量是固定的。我们需要从这些物品中挑选一部分,使得背包内物品的总价值最大,同时不超过背包的总容量。 举个例子:假设这组物品的质量…

刷题日常(找到字符串中所有字母异位词,​ 和为 K 的子数组​,​ 滑动窗口最大值​,全排列)

找到字符串中所有字母异位词 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 题目分析: 1.将p里面的字符先丢进一个hash1中,只需要在S字符里面找到多少个和他相同的has…

《C++ Primer Plus》学习笔记|第8章 函数探幽 (24-11-30更新)

文章目录 8.1 内联函数8.2 引用变量8.2.1 创建引用变量8.2.2 将引用用作函数参数8.2.3 引用的属性和特别之处特点1:在计算过程中,传入的形参的值也被改变了。特点2:使用引用的函数参数只接受变量,而不接受变量与数值的运算左值引用…

[2024年1月28日]第15届蓝桥杯青少组stema选拔赛C++中高级(第二子卷、编程题(1))

参考程序&#xff1a; #include <iostream> #include <algorithm> // 用于 std::sortusing namespace std;int main() {int a, b, c;cin >> a >> b >> c;// 将三个数放入一个数组中int arr[3] {a, b, c};// 对数组进行排序sort(arr, arr 3);…

基于hexo框架的博客搭建流程

这篇博文讲一讲hexo博客的搭建及文章管理&#xff0c;也算是我对于暑假的一个交代 &#xff01;&#xff01;&#xff01;注意&#xff1a;下面的操作是基于你已经安装了node.js和git的前提下进行的&#xff0c;并且拥有github账号 创建一个blog目录 在磁盘任意位置创建一个…

基于Java Springboot传统戏曲推广微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

数据结构--树二叉树顺序结构存储的二叉树(堆)

前言 前面我们学习了顺序表、链表、栈和队列&#xff0c;这些都是线性的数据结构。今天我们要来学习一种非线性的数据结构——树。 树的概念及结构 树的概念 树是一种非线性的数据结构&#xff0c;是由n&#xff08;n≥0&#xff09;个有效结点组成的一个具有层次关系的集合…

网络安全运行与维护 加固练习题

1. 提交用户密码的最小长度要求。 输入代码: cat /etc/pam.d/common-password 提交答案: flag{20} 2.提交iptables配置以允许10.0.0.0/24网段访问22端口的命令。 输入代码: iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT 提交答案: flag{iptables -A I…