关闭

迪米特法则——避免过长的对象链

标签: 设计模式
1180人阅读 评论(0) 收藏 举报
分类:

转载请标明出处,本文出自:chaossss的博客


迪米特法则是什么

迪米特法则(Law of Demeter,LoD)也称为最少知道原则(Least Knowledge Principle,LKP)。一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的public方法,我就调用这么多,其他的一概不关心。

为什么需要迪米特法则

在网上看了许多解释,感觉都不太靠谱,转战 StackOverflow 得到比较合理的理解,下面我用代码来解释吧:

假如我们是教育局的领导,我们有权利查询任何一家大学的信息,并且得到大学里面任意一名学生的信息,那么我们常常会实现下面的代码:

public class EducateManager {
    public School getSchool(String schoolName){
        return new School(schoolName);
    }
}

public class School {
    public School(String schoolName) {
    }

    public String getStu(String stuName) {
        return new Student(stuName);
    }
}

public class Student {
    private String name;
    private String from;

    public Student(String stuName) {
        name = stuName;
    }

    public String getStuFrom(){
        return from;
    }
}

public class Test {
    public static void main(String[] args) {
        EducateManager manager = new EducateManager();
        System.out.println(manager.getSchool("UESTC").getStuName("xxx").getStuFrom());
    }
}

我们可以看到,如果我们想要获得某一个学生的籍贯,就得通过 manager.getSchool("UESTC").getStuName("xxx").getStuFrom() 代码段来获得。也就是说,为了得到学生的名字,我们还得到了 School 类和 Student 类内的细节。

上面提到的情况,就是迪米特法所不希望看到的情况。大家可以理解为:减少对象链的长度。事实上,我们如果要得到学生的籍贯,调用获得籍贯法的类完全不需要知道怎么通过领导的权利找到学校,怎么通过学校找到学生。该类只在意:我要得到学生的名字,你内部发生了什么和我没关。

那么由迪米特法则得到的理想代码段应该是:manager.getStuFrom("xxx")

所以迪米特法则实际提倡的是:每一个类只应该和该类创建的对象产生耦合,而不是和该类创建的对象的方法的返回对象产生耦合。简单来说就是:避免为代码依赖关系添加传递性。

迪米特法则的意义

迪米特法则的核心观念就是类间解耦,弱耦合,只有让类间成弱耦合关系,类的服用率才可以提高。但这样也会产生问题:在实现过程中必然会产生大量的中转或跳转类,导致系统的复杂性提高,同时也为维护带来了难度。在考虑迪米特法则时一定要反复权衡,既做到让结构清晰,又做到高内聚、低耦合。

如果只是为了遵循迪米特法则而去运用迪米特法则设计代码,必然会带来许多问题。

1
0
查看评论

建议149:使用表驱动法避免过长的if和switch分支

建议149:使用表驱动法避免过长的if和switch分支 随着代码变得复杂,我们很容易被过长的if和switch分支困扰。 一个类枚举类型Week如下: enum Week { Monday, Tuesday, Wednesda...
  • houwc
  • houwc
  • 2016-09-14 11:08
  • 677

六大设计原则--迪米特法则【Low Of Demeter】

定义 迪米特法则也叫做最少知识原则(Least Knowledge Principle),指一个对象应该对其他对象有最少的了解,通俗的讲:一个类对自己需要耦合或者调用的类应该知道的最少,你类内部是怎么复杂、怎么的纠缠不清都和我没关系,那是你的类内部的事情,我只关心你提供的public方法,我...
  • sinat_20645961
  • sinat_20645961
  • 2015-08-23 07:50
  • 4404

设计原则之迪米特法则

定义       如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。——百度百科 解释:      迪米特法则又叫最少知识原则,就是说一个对象应...
  • Code_Thinking
  • Code_Thinking
  • 2014-12-05 11:25
  • 713

《java与模式》笔记(七) 迪米特法则

☆ 迪米特法则,又叫最少知识原则,就是说,一个对象应当对其他对象有尽可能少的了解。ξ 11.1 迪米特法则的各种表述① 只与你直接的朋友们通信;② 不要跟“陌生人”说话;③ 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。ξ 11.2 狭义的迪米特法则☆ 如果两...
  • plusir
  • plusir
  • 2006-08-21 22:52
  • 4111

迪米特法则学习笔记

http://my.oschina.net/shyl/blog/531542
  • situjiang
  • situjiang
  • 2016-01-16 18:12
  • 327

Dubbo服务调用问题

1.Forbid consumer XXX access service com.diit.facade.operation.service.UserFacade from registry 127.0.0.1:2181 use dubbo version 2.8.4, Please check r...
  • liuguidongliuguidong
  • liuguidongliuguidong
  • 2017-06-13 22:33
  • 103

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

在《投名状》这部轰动一时的影片中有这么一个片段,慈禧太后召见庞青龙,带路的太监说,从门口到见到老佛爷(也就是慈禧太后)这条短短的路他花了大半辈子才走完,而很多人一辈子也走不完,感叹道:“你倒好,这么短的时间里就走了别人花费一生才能走完的道路”。 定义:     迪米特法则(L...
  • yuluows
  • yuluows
  • 2011-12-18 21:14
  • 4210

java 设计模式之迪米特法则

java 设计模式之迪米特法则
  • coderinchina
  • coderinchina
  • 2016-02-23 14:17
  • 552

Java设计模式(七)依赖倒转原则与迪米特法则

今天我们先介绍两个面向对象的程序设计中十分重要的两个设计原则:依赖倒转原则和迪米特法则。
  • u013916933
  • u013916933
  • 2016-06-16 09:32
  • 610

dubbo调用链/过滤器链的创建分析

前言 使用Dubbo时,当调用方法,会通过过滤器对调用进行一些处理。例如超时记录(TimeoutFilter),异常(ExceptionFilter),token(TokenFilter)等处理。这个功能的实现是通过Dubbo内置的Filter或用户自定义的Filter来创建调用链完成。当发起方法...
  • Revivedsun
  • Revivedsun
  • 2017-02-01 12:15
  • 2441
    个人资料
    • 访问:210233次
    • 积分:4459
    • 等级:
    • 排名:第7964名
    • 原创:234篇
    • 转载:8篇
    • 译文:0篇
    • 评论:46条
    博客专栏
    最新评论