一个对象应当对其他对象有尽可能少的了解。

11.1 迪米特法则的各种表述:
1)只与你直接的朋友们通信。
2)不要跟“陌生人”说话。
3)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。

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

朋友圈的确定
“朋友”条件:
1)当前对象本身(this)
2)以参量形式传入到当前对象方法中的对象
3)当前对象的实例变量直接引用的对象
4)当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友
5)当前对象所创建的对象
任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”;否则就是“陌生人”。
缺点:会在系统里造出大量的小方法,散落在系统的各个角落。

与依赖倒转原则互补使用

11.3 迪米特法则与设计模式
门面模式*
调停者模式*

11.4 广义的迪米特法则
迪米特法则的主要用意是控制信息的过载。在将迪米特法则运用到系统设计中时,要注意下面的几点:
1)在类的划分上,应当创建有弱耦合的类。
2)在类的结构设计上,每一个类都应当尽量降低成员的访问权限。
3)在类的设计上,只要有可能,一个类应当设计成不变类。
4)在对其他类的引用上,一个对象对其对象的引用应当降到最低。

11.5 广义迪米特法则在类的设计上的体现
1)优先考虑将一个类设置成不变类
2)尽量降低一个类的访问权限
3)谨慎使用Serializable
4)尽量降低成员的访问权限
5)取代C Struct

一个类似于C Struct的Java类:

public   class  Point
{
  
public   int  x;
  
public   int  y;
}

一个好的设计:
public class Point
{
  
private int x;
  
private int y;
  
public Point(int x, int y)
  
{
    
this.x = x;
    
this.y = y;
  }

  
public int getX()
  
{
    
return x;
  }

  
public int getY()
  
{
    
return y;
  }

  
public void setX(int x)
  
{
    
this.x = x;
  }

  
public void setY(int y)
  
{
    
this.y = y;
  }

}

11.6 广义迪米特法则在代码层次上的实现
1)限制局域变量的有效范围

欢迎大家访问我的个人网站 萌萌的IT人