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

news2025/1/18 11:03:42

文章目录

  • 前言
  • 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即可将几个相关类的所有参数设置好。这里代码部分比较伪代码,其实还应该有,低中高极高四种情况的一个传参。

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

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

总结

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

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

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

相关文章

GDPU Android移动应用 访问网络

接到网络,开启你的访问之旅。 WebView的简单使用 WebView的简单使用,创建一个部件,上面一个button,下面一个webview布满整个屏幕,设置Web View的属性,使其可以执行Javascript(自己尝试设置其他属性&#xf…

【burp】burpsuite基础(八)

Burp Suite基础(八) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 ip伪装 安装组件jython 下载好后,在burp中打开扩展…

使用 EasyExcel 提升 Excel 处理效率

目录 前言1. EasyExcel 的优点2. EasyExcel 的功能3. 在项目中使用 EasyExcel3.1 引入依赖3.2 实体类的定义与注解3.3 工具类方法的实现3.4 在 Controller 中使用 4. 总结5. 参考地址 前言 在日常开发中,Excel 文件的处理是不可避免的一项任务,特别是在…

Liunx 中篇

3.4 打包压缩命令 3.5 文本编辑命令 文本编辑的命令,主要包含两个: vi 和 vim,两个命令的用法 类似,我们课程中主要讲解vim的使用。 3.5.1 vi和vim介绍 作用: vi命令是Linux系统提供的一个文本编辑工具,可以对文 件内容进行编辑…

kali Linux 安装配置教程(图文详解)

目录 一、下载安装VMware二、下载kali镜像三、安装kali到虚拟机 一、下载安装VMware 点我查看 二、下载kali镜像 官网下载:https://www.kali.org/get-kali/#kali-platforms 演示下载的为下图左边的,实际我们直接下载右侧虚拟机的直接使用就行 右侧下…

Bootstrap-HTML(四)徽章与表格

Bootstrap-HTML(四)徽章与表格 前言一、Bootstrap5 徽章(一)徽章的作用及创建(二)胶囊徽章(三)元素内的徽章 二、Bootstrap5 表格(一)创建一个简单的表格&…

RabbitMQ介绍及安装

文章目录 一. MQ二. RabbitMQ三. RabbitMQ作用四. MQ产品对比五. 安装RabbitMQ1. 安装erlang2. 安装rabbitMQ3. 安装RabbitMQ管理界⾯4. 启动服务5. 访问界面6. 添加管理员用户7. 重新登录 一. MQ MQ( Message queue ), 从字⾯意思上看, 本质是个队列, FIFO 先⼊先出&#xff…

Java基础复习

“任何时候我也不会满足,越是多读书,就越是深刻地感到不满足,越感到自己知识贫乏。科学是奥妙无穷的。” ——马克思 目录 一、方法&方法重载 二、运算符 三、数据类型 四、面向对象 1. 面向对象思想 2. 引用传递 3. 访问权限修饰…

高级架构二 Git基础到高级

一 Git仓库的基本概念和流程 什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何…

Docker保存镜像和导入镜像文件(图文详解)

Docker保存镜像和导入镜像文件(图文详解) Docker 保存和导入镜像文件是 Docker 镜像管理中的两个关键操作,它们在不同的场景下有着各自的意义和用途。以下是对这两个操作的详细说明: 1 基本命令介绍 1.1 Docker 保存镜像&#…

Vue指令(一)--v-html、v-show、v-if、v-else、v-else-if、v-on、v-bind、v-for、v-model

目录 (一)初识指令和内容渲染指令v-html 1.v-html 案例: 官网的API文档 (二)条件渲染指令v-show和v-if 1. v-show 2. v-if (三)条件渲染指令v-else和v-else-if 案例 (四…

CV工程师专用键盘开源项目硬件分析

1、前言 作为一个电子发烧友,你是否有遇到过这样的问题呢。当我们去查看函数定义的时候,需要敲击鼠标右键之后选择go to definition。更高级一些,我们使用键盘的快捷键来查看定义,这时候可以想象一下,你左手按下ALT&a…

源码可运行-PHP注册登录源码,PHP实现登陆后才能访问页面

最近有一个项目需要实现会员注册和页面登陆后才能访问,所以简单的HTML是无法实现的,就必须通过PHP、html和Mysql来实现,先给大家看一下登录和注册页的效果图。(注册完成后会自动跳转到登录窗口,即使A用户登陆后分享了网…

如何本地存储中的文件路径

文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…

从变更到通知:使用Python和MongoDB Change Streams实现即时事件监听

MongoDB提供了一种强大的功能,称为Change Streams,它允许应用程序监听数据库中的变更事件,并在数据发生变化时立即做出响应。这在mysql数据库是不具备没有这个功能的。又如:我们在支付环节想一直监听支付回调的状态,就…

Lua使用点号和冒号的区别

首先建立一个table,再分别定义两个方法,如下: local meta {}function meta:test1(...)print(self)print("")for k,v in pairs({...}) doprint(v)end endfunction meta.test2(...)print(self)print("")for k,v in pairs…

Metasploit使用

最近在学Metasploit,Metasploit是一个免费的、可下载的渗透测试框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击,是一个集成了渗透测试全流程的渗透工具。 图一 模块:模块组织按照不同的用途分为7种类型的模块 &am…

如何“安装Android SDK“?

一、下载 https://android-sdk.en.softonic.com/ 二、解压(不能有中文) 三、配置环境变量 1、ANDROID_HOME:D:\android-sdk 2、在Path添加文件路径 四、验证 adb version

排查bug的通用思路

⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后,响应较慢,通用的问题排查方法: 从多个角度来排查问题 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评…

前端路径“@/“的使用和配置

环境:vitets 需要安装types/node npm install types/node --save-dev在tsconfig.json中添加 如果有tsconfig.app.json和tsconfig.node.json文件,则在app.json中添加 "compilerOptions": {"baseUrl":".","paths&q…