迪米特法则是什么?

Posted veda0612

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迪米特法则是什么?相关的知识,希望对你有一定的参考价值。

什么是迪米特法则呢?

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

 

重点强调:

  1. 一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。也就是说一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易。
  2. 迪米特法则还有一个更简单的定义:只与直接的朋友通信,不跟陌生人讲话。
  3. 直接朋友是什么呢?我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。
  4. 耦合的方式有依赖、关联、组合、聚合等。
  5. 陌生的类最好不要作为局部变量的形式出现在类的内部。

 

举例解释:

  例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;
    }
}

这段代码就符合迪米特法则,手机中有阅读软件,阅读软件中有书籍,手机没有书籍任何影子,没有发生耦合。


 

总结一下:

  1)迪米特法则的初衷是降低类之间的耦合,由于每个类都减少了不必要的依赖,因此的确可以降低耦合关系。但是凡事都有度,虽然可以避免与非直接的类通信,但是要通信,必然会通过一个“中介”来发生联系,在采用迪米特法则时要反复权衡,既做到结构清晰,又要高内聚低耦合
  2)遵守迪米特法则会相对容易地做到对修改关闭。

 

参考资料:

https://zhuanlan.zhihu.com/p/54147707?utm_source=qq&utm_medium=social&utm_oi=863821215490527232

以上是关于迪米特法则是什么?的主要内容,如果未能解决你的问题,请参考以下文章

5迪米特法则LoD

设计模式—— 五:迪米特原则

6大设计原则之迪米特法则

设计原则之迪米特法则的概念及实例代码操作

迪米特法则

[设计模式]迪米特法则