设计原则之迪米特法则

定义

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

解释:

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

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

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

     实体相互作用。那么当想要与其他第三方发生相互作用时,应该依靠与自己直接联系的实体(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();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值