迪米特(最少知识)法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
根本思想是:强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
这个法则体现的是“高内聚,低耦合”的设计思想。
举个例子:我刚到公司上班,电脑坏了,需要技术部派人来给我修电脑,我不需要认识来给我修电脑的人是谁,我只需要认识技术部门的主管,具体他拍谁来给我修电脑,那是他的事。我的目的是赶紧把电脑修好。下面我们使用代码来实现这个小例子。
维修类:repair.cs
namespace Dimiter
{
/// <summary>
/// 维修抽象类
/// </summary>
public abstract class repair
{
public abstract bool RepairComputer();
}
}
维修技术小王类xiaowang.cs
namespace Dimiter
{
/// <summary>
/// 维修技术小王类
/// </summary>
public class xiaowang:repair
{
public override bool RepairComputer()
{
return false;
}
}
}
维修技术小李类xiaoli.cs
namespace Dimiter
{
/// <summary>
/// 维修技术小李类
/// </summary>
public class xiaoli:repair
{
public override bool RepairComputer()
{
return true;
}
}
}
技术部主管类director.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dimiter
{
/// <summary>
/// 主管类
/// </summary>
public class director
{
public bool res;
public void CallRepair()
{
repair xiaowang = new xiaowang();
res = xiaowang.RepairComputer();
if (res)
{
Console.WriteLine("小王去给你修电脑了");
return;
}
repair xiaoli = new xiaoli();
res = xiaoli.RepairComputer();
if (res)
{
Console.WriteLine("小李去给你修电脑了");
return;
}
Console.WriteLine("我来了。");
}
}
}
客户端调用:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Dimiter
{
/// <summary>
/// 客户端
/// </summary>
class Program
{
static void Main(string[] args)
{
// 我只需要联系技术部门主管就可以了,具体他安排谁来给我修电脑。
// 怎么安排的,跟我没有关系,我的目的是吧电脑修好
director dir = new director();
dir.CallRepair();
Console.ReadLine();
}
}
}
输出结果如下图所示:
总结一下:迪米特法则的优缺点
优点:
:1: 迪米特法则的做法观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用率才可以提高。
缺点:
1: 造成系统的不同模块之间的通信效率降低,使系统的不同模块之间不容易协调等缺点。
:2:因为迪米特法则要求类与类之间尽量不直接通信,如果类之间需要通信就通过第三方转发的方式,这就直接导致了系统中存在大量的中介类,大大增加了系统的复杂度。
3: 解决这个问题的方式是:使用依赖倒转原则(通俗的讲就是要针对接口编程,不要针对具体编程), 这要就可以是调用方和被调用方之间有了一个抽象层,被调用方在遵循抽象层的前提下就可以自由的变化,此时抽象层成了调用方的朋友。
有好的建议,请在下方输入你的评论。
欢迎访问个人博客
https://guanchao.site
欢迎访问小程序: