迪米特(最少知识)法则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
根本思想是:强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。
这个法则体现的是“高内聚,低耦合”的设计思想。
举个例子:我刚到公司上班,电脑坏了,需要技术部派人来给我修电脑,我不需要认识来给我修电脑的人是谁,我只需要认识技术部门的主管,具体他拍谁来给我修电脑,那是他的事。我的目的是赶紧把电脑修好。下面我们使用代码来实现这个小例子。
维修类: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: 解决这个问题的方式是:使用依赖倒转原则(通俗的讲就是要针对接口编程,不要针对具体编程), 这要就可以是调用方和被调用方之间有了一个抽象层,被调用方在遵循抽象层的前提下就可以自由的变化,此时抽象层成了调用方的朋友。