第11章 迪米特法则(LoD 笔记)

[b]迪米特法则[/b](Law of Demeter)又叫做最少知识原则(Least Knowledge Principle),就是说,一个对象应当对其他对象有尽可能少的了解。
[b]狭义的迪米特法则[/b]
如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
[b]不满足迪米特法则的系统[/b]
这里要讨论的系统由三个类组成,分别是Someone,Friend和Stranger。其中Someone与Friend是朋友,而Friend与Stranger是朋友。系统的结构图如下图所示。


[img]http://dl.iteye.com/upload/attachment/440883/540452d2-8bad-304b-81cc-b65b238bcffb.png[/img]


从上面的类图可以看出,Friend持有一个Stranger对象的引用,这就解释了为什么Friend与Stranger是朋友。为了解释为什么Someone与Friend是朋友,参见Someone的源码:
public class Someone {
public void operation1(Friend friend) {
Stranger stranger = friend.provideStranger();
stranger.operation3();
}
}


Friend的provideStranger()方法会提供自己所创建的Stranger的实例,代码如下:
public class Friend {
private Stranger stranger = new Stranger();
public void operation2() {

}
public Stranger provideStranger() {
return stranger;
}
}


Someone的方法operation1()不满足迪米特法则。因为这个方法引用了Stranger对象,而Stranger对象不是Someone的朋友。
[b]使用迪米特法则进行改造[/b]
可以使用迪米特法则对上面的例子进行改造,改造的做法就是调用转发。改造后的情况如图:

[img]http://dl.iteye.com/upload/attachment/440897/e44e7930-f7b3-3cdd-8289-096885d4b98c.png[/img]


从上面的类图可以看出,与改造前相比,在Someone与Stranger之间的联系已经没有了。Someone不需要知道Stranger的存在就可以做同样的事情。Someone的源码如下:
public class Someone {
public void operation1(Friend friend) {
friend.forward();
}
}

forward()方法是做什么的呢?
public class Friend {
private Stranger stranger = new Stranger();
public void operation2() {

}
public void forward {
stranger.operation3();
}
}


[b]狭义的迪米特法则的缺点[/b]
遵循狭义的迪米特法则会产生一个明显的缺点:会在系统里造出大量的小方法,散落在系统的各个角落。这些方法仅仅是传递间接的调用,因此与系统的商务逻辑无关。当设计师试图从一张类图看出总体的架构时,这些小的方法会造成迷惑和困扰。
遵循类之间的迪米特法则会使一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。
[b]与依赖倒转原则互补使用[/b]


[img]http://dl.iteye.com/upload/attachment/440901/eaeb34ce-de22-3ae1-85a7-fc4c0390058a.png[/img]


Someone现在与一个抽象角色建立了朋友关系,这样做的好处是“朋友”可以随时将具体的Stranger换掉。
[b]门面模式与调用者模式实际上就是迪米特法则的应用。[/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值