迪米特法则(LoD 笔记)

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





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


Friend的provideStranger()方法会提供自己所创建的Stranger的实例,代码如下:
Java代码 复制代码  收藏代码
  1. public class Friend {   
  2.     private Stranger stranger = new Stranger();   
  3.     public void operation2() {   
  4.            
  5.     }   
  6.     public Stranger provideStranger() {   
  7.         return stranger;   
  8.     }   
  9. }  
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的源码如下:
Java代码 复制代码  收藏代码
  1. public class Someone {   
  2.     public void operation1(Friend friend) {   
  3.         friend.forward();   
  4.     }   
  5. }  
public class Someone {
	public void operation1(Friend friend) {
		friend.forward();
	}
}

forward()方法是做什么的呢?
Java代码 复制代码  收藏代码
  1. public class Friend {   
  2.     private Stranger stranger = new Stranger();   
  3.     public void operation2() {   
  4.            
  5.     }   
  6.     public void forward {   
  7.         stranger.operation3();   
  8.     }   
  9. }  
public class Friend {
	private Stranger stranger = new Stranger();
	public void operation2() {
		
	}
	public void forward {
		stranger.operation3();
	}
}


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





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值