`

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

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





从上面的类图可以看出,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的朋友。
使用迪米特法则进行改造
可以使用迪米特法则对上面的例子进行改造,改造的做法就是调用转发。改造后的情况如图:




从上面的类图可以看出,与改造前相比,在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();
	}
}


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





Someone现在与一个抽象角色建立了朋友关系,这样做的好处是“朋友”可以随时将具体的Stranger换掉。
门面模式与调用者模式实际上就是迪米特法则的应用。



  • 大小: 9.1 KB
  • 大小: 10.5 KB
  • 大小: 12.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics