迪米特法则是什么?
Posted veda0612
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迪米特法则是什么?相关的知识,希望对你有一定的参考价值。
什么是迪米特法则呢?
迪米特法则(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; } }
正确的例子:
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()); } } class Book2 { private String title; public Book2(String title) { this.title = title; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
这段代码就符合迪米特法则,手机中有阅读软件,阅读软件中有书籍,手机没有书籍任何影子,没有发生耦合。
总结一下:
参考资料:
https://zhuanlan.zhihu.com/p/54147707?utm_source=qq&utm_medium=social&utm_oi=863821215490527232
以上是关于迪米特法则是什么?的主要内容,如果未能解决你的问题,请参考以下文章