2.5 迪米特法则
迪米特法则英文名称是Law of Demeter,简称LoD。
2.5.1 迪米特法则的定义
迪米特法则又叫最少知识原则(Least Knowledge Principle,LKP),意思是一个对象应当对其他对象尽可能少的了解。迪米特法则最初是用来作为面向对象的系统设计风格的一种法则,在1987年由Ian Holland在美国东北大学为一个叫迪米特的项目设计提出的,因此叫做迪米特法则。这条法则实际上是很多著名系统,例如火星登陆软件系统、木星的欧罗巴卫星轨道飞船的软件系统的指导设计原则。
迪米特法则不同于其他的OO设计原则,它具有很多种表述方式,其中具有代表性的是以下几种表述:
■ 只与你直接的朋友们通信(Only talk to your immediate friends);
■ 不要跟“陌生人”说话(Don't talk to strangers);
■ 每一个软件单位对其他的单位都只有最少的了解,这些了解仅局限于那些与本单位密切相关的软件单位。
按照迪米特法则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用;如果一个类需要调用另一个类的某一个方法,可以通过第三者转发这个调用。例如,“某人”与一个“朋友”组成自己的朋友圈,两个人都需要与一个圈外的“陌生人”发生相互作用,不符合迪米特法则的类图如图2-8所示。
图2-8 不符合迪米特法则的类图
其实,“某人”没有必要与“陌生人”直接发生相互作用,他可以通过“朋友”间接与“陌生人”发生作用,如图2-9所示的类图符合迪米特法则。
图2-9 符合迪米特法则的类图
2.5.2 迪米特法则的应用
下述内容用于实现任务描述2.D.5,演示迪米特法则的应用。如图2-10所示为符合迪米特法则的“某人”、“朋友”和“陌生人”的具体类图。
图2-10 Someone、Friend和Stranger类图
Someone类的源代码如下所示。
【描述2.D.5】 Someone.java
public class Someone { //通过Friend间接调用Stranger类中的方法 public void call(Friend friend) { friend.forward(); } }
Friend类的源代码如下所示。
【描述2.D.5】 Friend.java
//朋友、中间类 public class Friend { // 声明陌生实例 private Stranger stranger = new Stranger(); // 访问 public void forward() { stranger.strangerMethod(); } // 其他方法 public void friendMethod() { System.out.println("这是朋友的方法"); } }
Stranger类的源代码如下所示。
【描述2.D.5】 Stranger.java
//陌生者 public class Stranger { public void strangerMethod() { System.out.println("这是陌生者方法"); } }
下面编写一个测试类进行应用,其代码如下所示。
public class TestLoD { public static void main(String args[]) { Someone one = new Someone(); one.call(new Friend()); } }
运行结果如下所示。
这是陌生者方法
通过上述代码可以看到,Someone没有与Stranger类直接联系,而是通过Friend类进行间接访问,这样减少了类之间的关系,降低了类之间的耦合。迪米特法则的核心观念就是类之间的解耦、弱耦合,只有弱耦合了以后,类的复用率才可以提高。
在设计模式中,对迪米特法则进行应用的设计模式有如下两个:
■ 外观模式
■ 中介者模式