法则定义
迪米特原则(Law Of Demeter)也被称为最少知识原则。表述为一个类应该对其耦合的其他类或所调用的
类知道的最少,也就是被依赖的类向外公开的方法应该尽可能的少。
迪米特法则还有一种解释:Only talk to your immediate friends,即只与“直接的朋友”通信。
应用到面向对象的程序设计中时,可描述为 "类应该与其协作类进行交互但无需了解它们的内部结构"。
而直接朋友则通常表现为关联、聚合和组成关系,即两个对象之间联系更为紧密,通常以成员变量,方法
的参数和返回值的形式出现。这样的好处会使代码结构耦合性更低,便于后期维护。
在面向对象程序中
法则规定:类中的方法都应该只调用属于以下情况的方法
这个对象自己拥有的方法;
传入该方法的参数的方法;
该方法创建的对象的方法;
该对象直接拥有的对象的方法;
也就是对象应尽可能避免“调用”由另一个方法返回的对象的“方法”
举例来说:你(A)有件事情交给 B 去来完成,但是 B 却给你返回了 C 对象,让你在跟 C 去沟通,这时 A 无疑
是奔溃的,它得在去跟 C 去沟通,加大了做事的成本。
所以我们应该要避免这种情况,对于 A 来说,它只应该跟直接的朋友 B 去沟通,至于 B 的实现方式它不需要知道,即使
后期B 的实际细节更改了,A和B的交互是没有变得。
错误例子
场景描述: 老师给同学们布置了一道作业,有书籍、APP 和手机三个对象,来实现使用 手机 APP 查看电子书的过程。
public class LODErrorTest {
public static void main(String[] args) {
Phone phone = new Phone();
phone.readBook();
}
}
/**
* 错误的示范
*/
class Phone {
App app = new App();
Book book = new Book("设计模式");
public void readBook() {
app.read(book);
}
}
class App {
public void read(Book book) {
System.out.println(book.getTitle());
}
}
在上面的例子中,书籍和 APP 是所属关系,而手机则包含了俩者,这样的结构其实是有问题的。我们在使用手机阅读的时候,顺序上是先和 APP 来交互的,然后在打开
APP 来进行阅读,所以书籍和手机俩者应该是互不感知的。
正确例子
public class LODRightTest {
public static void main(String[] args) {
Phone2 phone2 = new Phone2();
phone2.readBook();
}
}
/**
* 正确的示范
*/
class Phone2 {
private App2 app2 = new App2();
public void readBook() {
app2.read();
}
}
class App2 {
private Book2 book2 = new Book2("设计模式");
public void read() {
System.out.println(book2.getTitle());
}
}
总结
在代码的实现过程中,我们应该需要在使用对象的时候思考这个对象是否和这个类有直接的关系,是不是我们直接的朋友。
网友评论