定义
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。——百度百科
解释:
迪米特法则又叫最少知识原则,就是说一个对象应该尽可能少的了解其他对象——不要和陌生人说话。
那么问题来了?那应该和谁说话?答案是和自己的直接朋友说话。在面向对象的开发中该法则的表现是:
一个实体(如类)应该尽可能少的与其他实体相互作用,如果要相互作用也应该是和与自己直接相联系的
实体相互作用。那么当想要与其他第三方发生相互作用时,应该依靠与自己直接联系的实体(friend)转接
这种相互作用。可以认为就是当类A需要调用另一个非直接相联系的类(类C)的方法时,可以通
过friend类(类B)调用类C的方法,然后类A再调用其friend类(类B)中的相应的方法。
作用:
在合成/聚合复用原则中,使用合成/聚合来尽量避免使用继承实现复用,那么这也带来了一个问题,就是类与类
之间的依赖关系增加了。而迪米特法则就是用来减少类与类之间依赖的,这样就降低了类之间的耦合度,使得
模块之间相对独立,有利于代码复用,同时当对一个类修改时也不会过多的影响其他类。
代码示例:
《设计模式其实很简单》这本书中给了一个例子,如下:
//某人类
public class Somebody
{
//参数Friend类的方法
public void operation1(Friend friend)
{
Stranger stranger=friend.provide();
stranger.operation3();
}
}
//朋友类Friend
public class Friend
{
//私有数据成员,某个陌生人
private Stranger stranger=new Stranger();
public void operation2()
{
}
public Stranger provide()
{
return stranger;
}
}
上面的代码违反了迪米特法则,因为如果要给Somebody定义一个它的直接关联类(即一个Friend的话),那么这个类应该是Friend类,因为Somebody的一个方法需要Friend类作为参数,那么这样以来,Stranger类就不是Somebody的直接关联类,但是上面的Somebody的operation1方法却直接调用了Stranger类的operation3方法,所以这违反了迪米特法则。
所以应该在Friend类中加一个方法,它执行了对Stranger类的operation3方法的调用。然后在Somebody的operation1方法中有friend调用加入的那个方法,从而实现和上面代码相同的功能。
代码如下:
//朋友类
public class Friend
{
private Stranger stranger=new Stranger();
pubic void operation2()
{
}
public void provide()
{
return stranger;
}
pubic void forward()
{
stranger.operation3();
}
}
//某人类
public class Somebody
{
public void operation1(Friend friend)
{
friend.forward();
}
}