设计模式七大原则-迪米特法原则

一、概念

迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少地与其他实体发生相互作用。

百度词条上定义:迪米特法则(Law of Demeter)又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。

朋友类即为耦合类,这里的朋友定义
1.类成员变量
2.某个类成员函数参数为类对象
3.某个类成员函数返回值为类对象

在编程上,它变成具有以下特点:

1.如果两个类不直接通信,那么这两个类就不应该发生直接的相互作用。

2.在类的结构设计上,每一个类都应该尽量降低成员的访问权限

3.该法则在适配器模式、解释模式等中有强烈的体现

4.强调类之间的松耦合,类之间的耦合越弱,越有利于复用

迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。

在将迪米特法则运用到系统设计中时,要注意下面的几点:在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

二、示例

在这里插入图片描述

在图1中,由于界面控件之间的交互关系复杂,导致在该窗口中增加新的界面控件时需要修改与之交互的其他控件的源代码,系统扩展性较差,也不便于增加和删除新控件。

  现使用迪米特对其进行重构。

在这里插入图片描述

在本实例中,可以通过引入一个专门用于控制界面控件交互的中间类(Mediator)来降低界面控件之间的耦合度。引入中间类之后,界面控件之间不再发生直接引用,而是将请求先转发给中间类,再由中间类来完成对其他控件的调用。当需要增加或删除新的控件时,只需修改中间类即可,无须修改新增控件或已有控件的源代码,

三、代码

class Voice
{
public:
	void Init(Microphone* pmircrophone)
	{
		
	}

	//声音
	void openVoice() {};
	void closeVoice() {};
};

class soundCard
{
public:
	void chooseType(int i)
	{

	}
private:
	void soundCardType1() {};
	void soundCardType2() {};
	void soundCardType3() {};
};

class Microphone
{
public:
	void Init()
	{
		openMicrophone();
		m_soundCard = new soundCard;
		m_soundCard->chooseType(1);
	}

	//麦克风
	void openMicrophone() {};
	void closeMicrophone() {};
public:
	soundCard* m_soundCard;
};

int main(int argv, char* argc[])
{
	Microphone* pMicrophone = new Microphone;
	Voice voice;
	voice.Init(pMicrophone);
	return 0;
}

————————————————

原文链接:https://blog.csdn.net/qq_42956179/article/details/115372247
————————————————
原文链接:https://blog.csdn.net/lovelion/article/details/7563445

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值