设计原则之迪米特法则

来源:互联网 发布:阿里云国际版没信用卡 编辑:程序博客网 时间:2024/06/02 22:00

定义

      如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。——百度百科

解释:

     迪米特法则又叫最少知识原则,就是说一个对象应该尽可能少的了解其他对象——不要和陌生人说话。

     那么问题来了?那应该和谁说话?答案是和自己的直接朋友说话。在面向对象的开发中该法则的表现是:

     一个实体(如类)应该尽可能少的与其他实体相互作用,如果要相互作用也应该是和与自己直接相联系的

     实体相互作用。那么当想要与其他第三方发生相互作用时,应该依靠与自己直接联系的实体(friend)转接

     这种相互作用。可以认为就是当类A需要调用另一个非直接相联系的类(类C)的方法时,可以通

     过friend类(类B)调用类C的方法,然后类A再调用其friend类(类B)中的相应的方法。

作用:

    在合成/聚合复用原则中,使用合成/聚合来尽量避免使用继承实现复用,那么这也带来了一个问题,就是类与类

    之间的依赖关系增加了。而迪米特法则就是用来减少类与类之间依赖的,这样就降低了类之间的耦合度,使得

    模块之间相对独立,有利于代码复用,同时当对一个类修改时也不会过多的影响其他类。

代码示例:

   《设计模式其实很简单》这本书中给了一个例子,如下:    

//某人类public  class Somebody{   //参数Friend类的方法   public void operation1(Friend friend)   {      Stranger stranger=friend.provide();      stranger.operation3();   }}//朋友类Friendpublic 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();    }}
0 0