设计模式学习[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.rhkb.cn/news/482182.html

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

相关文章

JUnit介绍:单元测试

1、什么是单元测试 单元测试是针对最小的功能单元编写测试代码(Java 程序最小的功能单元是方法)单元测试就是针对单个Java方法的测试。 2、为什么要使用单元测试 确保单个方法运行正常; 如果修改了代码,只需要确保其对应的单元…

用Transformers和FastAPI快速搭建后端算法api

用Transformers和FastAPI快速搭建后端算法api 如果你对自然语言处理 (NLP, Natural Language Processing) 感兴趣,想要了解ChatGPT是怎么来的,想要搭建自己的聊天机器人,想要做分类、翻译、摘要等各种NLP任务,Huggingface的Trans…

架构师:Dubbo 服务请求失败处理的实践指南

1、简述 在分布式服务中,服务调用失败是不可避免的,可能由于网络抖动、服务不可用等原因导致。Dubbo 作为一款高性能的 RPC 框架,提供了多种机制来处理服务请求失败问题。本文将介绍如何在 Dubbo 中优雅地处理服务请求失败,并结合具体实践步骤进行讲解。 2、常见处理方式 …

shell语法(1)bash

shell是我们通过命令行与操作系统沟通的语言,是一种解释型语言 shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用 Linux系统中一般默认使用bash为脚本解释器 在Linux中创建一个.sh文件,例如vim test.sh…

探索文件系统,Python os库是你的瑞士军刀

文章目录 探索文件系统,Python os库是你的瑞士军刀第一部分:背景介绍第二部分:os库是什么?第三部分:如何安装os库?第四部分:简单库函数使用方法1. 获取当前工作目录2. 改变当前工作目录3. 列出目…

Paper -- 建筑物高度估计 -- 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算

论文题目: Building height estimation from street-view imagery using deep learning, image processing and automated geospatial analysis 中文题目: 基于深度学习、图像处理和自动地理空间分析的街景图像建筑高度估算 作者: Ala’a Al-Habashna, Ryan Murdoch 作者单位: …

FTP介绍与配置

前言: FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时,还可以保证数据传输的可靠性和高效性。 介绍 FTP的应用 在企业网络中部署一台FTP服务器,将网络设备配置为FTP客户端,则可以使用FTP来备份或更新VRP文件和配置文件…

DDD领域应用理论实践分析回顾

目录 一、DDD的重要性 (一)拥抱互联网黑话(抓痛点、谈愿景、搞方法论) (二)DDD真的重要吗? 二、领域驱动设计DDD在B端营销系统的实践 (一)设计落地步骤 &#xff0…

【聚类】K-Means 聚类(无监督)及K-Means ++

1. 原理 2. 算法步骤 3. 目标函数 4. 优缺点 import torch import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.decomposition import PCA import torch.nn as nn# 数据准备 # 生成数据:100 个张量&#xff0c…

C++学习日记---第14天(蓝桥杯备赛)

笔记复习 1.对象的初始化和清理 对象的初始化和清理是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题 构造函数&…

网络安全防护指南:筑牢网络安全防线(5/10)

一、网络安全的基本概念 (一)网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…

【最新鸿蒙开发——应用导航设计】

大家好,我是小z,不知道大家在开发过程中有没有遇到模块间跳转的问题,今天给大家分享关于模块间跳转的三种方法 文章目录 1. 命名路由(ohos.router)使用步骤 2. 使用navigation组件跳转。步骤缺点 3. 路由管理模块1. 路由管理模块…

Wireshark常用功能使用说明

此处用于记录下本人所使用 wireshark 所可能用到的小技巧。Wireshark是一款强大的数据包分析工具,此处仅介绍常用功能。 Wireshark常用功能使用说明 1.相关介绍1.1.工具栏功能介绍1.1.1.时间戳/分组列表概况等设置 1.2.Windows抓包 2.wireshark过滤器规则2.1.wiresh…

【进阶篇-Day15:JAVA线程-Thread的介绍】

目录 1、进程和线程1.1 进程的介绍1.2 并行和并发1.3 线程的介绍 2、JAVA开启线程的三种方法2.1 继承Thread类:2.2 实现Runnable接口2.3 实现Callable接口2.4 总结: 3、线程相关方法3.1 获取和设置线程名字的方法3.2 线程休眠方法:3.3 线程优…

组播基础实验

当需要同时发给多个接受者或者接收者ip未知时使用组播 一、组播IP地址 1、组播IP地址范围 组播地址属于D类地址:224.0.0.0/4(224.0.0.0-239.255.255.255) 2、分类 (1)链路本地地址(link-local&#xf…

EasyDarwin搭建直播推流服务

学习链接 easydarwin官网 - 这里看介绍 easydarwin软件下载地址 - 百度网盘 easydarwin视频 B站 文章目录 学习链接使用下载EasyDarwin压缩包,并解压到目录启动EasyDarwin点播直播easyplayer.jsapidocffmpeg推流rtsp & ffplay拉流 使用 下载EasyDarwin压缩包…

Java有关数组的相关问题

Java中的栈和堆的含义 栈 存储局部变量:栈主要用于存储方法中的局部变量,包括基本数据类型(int、double、boolean等)和对象的引用(不包含对象本身)。 遵循后进先出原则:当一个方法被调用时&…

眼部按摩仪WT2605音频蓝牙语音芯片方案 单芯片实现语音提示及控制/手机无线音频传输功能

随着科技的快速发展,人们的生活方式也在不断改变,智能化、便捷化的产品逐渐成为市场的主流。眼部按摩仪作为一种结合了现代科技与健康生活理念的产品,受到了广大消费者的青睐。而在众多眼部按摩仪中,采用WT2605音频蓝牙芯片的方案…

ESP32-S3模组上跑通ES8388(12)

接前一篇文章:ESP32-S3模组上跑通ES8388(11) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第5段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在…

C#VB.NET开发整体一键国际化显示

第一章链接 第二章 窗口多国语言显示 在第一章时我们已经了解如何对内容进行多语言化下面讲解如何对窗口多语言显示 在实际开发中单个窗体内可能有很多控件,如果我们对每个控件使用Mu方法进行赋值是异常繁琐的如下 Button1.Text"显示".Mu(); 在对窗口进行多语言化SG…