迪米特法则是什么?

什么是迪米特法则呢?

  迪米特法则(Law of Demeter,简写为: LoD.)又叫作最少知识原则(Least Knowledge Principle 简写LKP),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,通俗来讲也就是对于被依赖的类来说,对外除了提供的public方法,向外公开的方法应该尽可能的少。

 

重点强调:

一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。也就是说一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易。

迪米特法则还有一个更简单的定义:只与直接的朋友通信,不跟陌生人讲话。

直接朋友是什么呢?我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。

耦合的方式有依赖、关联、组合、聚合等。

陌生的类最好不要作为局部变量的形式出现在类的内部。

举例解释:

  例1:假如你想办一件事情,但是凭借你自己的能力是做不到的,而你周围的朋友也无法帮你办到,但是恰好你有一个朋友A认识另外一个朋友B可以办成此事,那么你只能拜托你的朋友A中间牵线搭桥,让他的朋友B帮你办好此事,你跟B是陌生人关系。

                                                                       

迪米特法则是什么?

如果你没有通过你的朋友A,直接引用陌生人B的方法的话,那么这是不符合迪米特法则的。然而上图中,也是不符合的,为什么呢?

这是因为你还是和陌生人B直接关联上了,我们要的是你和陌生人B没有一丁点直接关系。

迪米特法则是什么?

这种方式,你甲和陌生人B之间就没有了任何直接联系,这样就避免了你和陌生人B的耦合度过高,所以符合迪米特法则。但是思考一下,仍然会存在一个通信效率低的问题,这个问题后续我们再来讨论如何解决。

例2:假设我们看书的操作是这样的:唤醒手机,打开阅读软件,选择书籍,然后阅读。总共 3 个步骤,涉及了 3 样东西:手机、软件、书籍。同学们用代码实现这个过程。

错误的例子:

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()); } } class Book { private String title; public Book(String title) { this.title = title; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxjzs.html