设计模式学习[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
{
public:
void 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
即可将几个相关类的所有参数设置好。这里代码部分比较伪代码,其实还应该有,低中高极高四种情况的一个传参。
当然了外观模式的重点不在这里,重点在于能否用这么一个统一的接口将所有的子类管理起来,使得界面一致,子类更方便使用。
外观模式结构图:
总结
迪米特法则也好,外观模式也罢。总而言之就是把一些不相关的类,用一个高层接口,包一层,管理起来,一起调用。
做到接口统一,类与类之间高内聚低耦合。