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

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

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

总结

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

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

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

相关文章

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比 目录 BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计…

【Linux】死锁、读写锁、自旋锁

文章目录 1. 死锁1.1 概念1.2 死锁形成的四个必要条件1.3 避免死锁 2. 读者写者问题与读写锁2.1 读者写者问题2.2 读写锁的使用2.3 读写策略 3. 自旋锁3.1 概念3.2 原理3.3 自旋锁的使用3.4 优点与缺点 1. 死锁 1.1 概念 死锁是指在⼀组进程中的各个进程均占有不会释放的资源…

Vue3之弹窗

文章目录 第一步、引入JS第二步、弹框 在前端开发语言Vue3&#xff0c;在管理端如何进行弹窗&#xff1f;下面根据API实现效果。 Element API文档&#xff1a; Element-plus文档 搭建环境可参考博客【 初探Vue3环境搭建与nvm使用】 第一步、引入JS <script lang"ts&…

2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素

三要素之间关系&#xff1a; 有了虚拟场景Scene&#xff0c;相机录像Camera&#xff0c;在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene&#xff1a; 这个场景为三要素之一&#xff0c;一切需要展示的东西都需…

cin/cout的性能优化和缓冲区同步问题

目录 背景导入 问题 1.1ios::sync_with_stdio(false) 1.2为什么要解除C/C IO流同步? 1.3使用场景 2.1cin和cout的绑定关系 2.2为什么要解除绑定关系? 2.3注意事项 背景导入 大家可以先看一下这段背景知识;后面我会谈谈自己的理解; 1.在C中&#xff0c;标准输⼊输出流…

node.js基础学习-url模块-url地址处理(二)

前言 前面我们创建了一个HTTP服务器&#xff0c;如果只是简单的http://localhost:3000/about这种链接我们是可以处理的&#xff0c;但是实际运用中一般链接都会带参数&#xff0c;这样的话如果我们只是简单的判断链接来分配数据&#xff0c;就会报404找不到链接。为了解决这个问…

基于springboot中小型制造企业质量管理系统源码和论文

信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古以来的…

服务器密码错误被锁定怎么解决?

当服务器密码错误多次导致账号被锁定时&#xff0c;解决方法需要根据服务器的操作系统&#xff08;如 Linux 或 Windows &#xff09;和具体服务器环境来处理。以下是常见的解决办法&#xff1a; 一、Linux 服务器被锁定的解决方法 1. 使用其他用户账号登录 如果有其他未被…

Java基础——(四)继承

1. 类、超类和子类 在Java中&#xff0c;通过关键字extends表示继承。extends表明正在构造的新类派生与一个已存在的类&#xff0c;已存在的类称为超类&#xff08;superclass&#xff09;、基类&#xff08;base class&#xff09;或父类&#xff08;parent class&#xff09…

Python语法基础(四)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说&#xff0c;A函数作为B函数的参数&#xff0c;B函数就是高阶函数 map&#xff1a;映射 map(func,iterable) 这个是map的基本语法&#xff0c;…

《datawhale2411组队学习 模型压缩技术7:NNI剪枝》

文章目录 一、NNI简介二、 NNI剪枝快速入门2.1 加载并训练模型2.2 模型剪枝2.3 模型加速&#xff08;剪枝永久化&#xff09;2.4 微调压缩模型2.5 Slim Pruner测试 三、 使用NNI3.0进行Bert压缩&#xff08;剪枝、蒸馏)3.1 数据预处理3.2 训练模型3.3 设置模型蒸馏函数3.4 修剪…

day22:lamp项目部署

一&#xff0c;lamp概述 lamp概述 LAMP 是一组开源软件的缩写&#xff0c;用于搭建动态网站或Web应用程序的基础环境。LAMP 代表了四个主要的组成部分&#xff1a; Linux&#xff1a;操作系统&#xff0c;LAMP 环境的基础。通常使用的是 Linux 发行版&#xff0c;如 CentOS、…

【提高篇】3.6 GPIO(六,寄存器介绍,下)

目录 2.3 输出速度寄存器OSPEEDR(GPIOx_OSPEEDR) (x = A..I) 2.4 上拉/下拉寄存器 (GPIOx_PUPDR) (x = A..I) 2.5 输入数据寄存器(IDR) 2.6 输出数据寄存器(ODR) 2.7 置位/复位寄存器(BSRR) 2.8 BSRR与ODR寄存器的区别 2.3 输出速度寄存器OSPEEDR(GPIOx_OSPEEDR) (…

【IMF靶场渗透】

文章目录 一、基础信息 二、信息收集 三、flag1 四、flag2 五、flag3 六、flag4 七、flag5 八、flag6 一、基础信息 Kali IP&#xff1a;192.168.20.146 靶机IP&#xff1a;192.168.20.147 二、信息收集 Nmap -sP 192.168.20.0/24 Arp-scan -l nmap -sS -sV -p- -…

记一次腾讯云海外服务器http能正常访问https访问拒绝问题处理过程

最近双十一, 购了一台腾讯云的海外服务器&#xff0c; 开通后就是一堆的服务器软件安装数据上传和配置&#xff0c;没想到&#xff0c;等待配置完成后才发现https无法正常访问&#xff0c;于是开启了自查。 1. 检查nginx软件的ssl配置 nginx http https配置参考 server {l…

hdlbits系列verilog解答(mt2015_muxdff)-90

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节要实现的电路来自于ECE253 2015中期测试问题5。要实现以下如图所示的时序电路中复用器及D触发器子模块。 模块声明 module top_module ( input clk, input L, input r_in, input q_in, output reg Q); 思路…

Android 图形系统之七:SurfaceFlinger

一. 引言 什么是 SurfaceFlinger&#xff1f;SurfaceFlinger 的核心作用和地位&#xff1f;为什么需要了解 SurfaceFlinger&#xff1f; 二. SurfaceFlinger 的基本概念 Surface 和 SurfaceFlinger 的关系SurfaceFlinger 与图形渲染&#xff08;OpenGL ES 和 Vulkan&#xf…

基于Java Springboot宠物服务中心微信小程序

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

算法妙妙屋-------1.递归的深邃回响:全排列的奇妙组合

全排列的简要总结 全排列&#xff08;Permutation&#xff09;是数学中一个经典的问题&#xff0c;指的是从一组元素中&#xff0c;将所有元素按任意顺序排列形成的所有可能序列。 特点 输入条件&#xff1a; 给定一组互异的元素&#xff08;通常为数组或字符串&#xff09;。…

内网穿透步骤

步骤 第一次需要验证token window和linux的方法不同。 然后 启动 cpolar 服务&#xff1a; 在命令窗口中输入 cpolar.exe htttp 8080&#xff0c;启动内网穿透服务。确保命令窗口保持开启状态&#xff0c;以维持穿透效果。 cpolar.exe hhttp 8080 成功后 注意事项 命令窗口…