基本介绍

1、一个对象应该对其他对象保持最少的了解

2、类与类关系越密切,耦合度越大

3、迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供public方法,不对外泄露任何信息

4、迪米特法则还有个更简单的定义:只与直接朋友通信

5、直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象只有有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

案例分析

public class Demeter1 {
public static void main(String[] args) {
SchoolManager schoolManager = new SchoolManager();
schoolManager.printAllEmployee(new CollegeManage());
}
} //总部员工的类
class Employee {
private String id; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
}
} //学院员工的类
class CollegeEmployee {
private String id; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
}
} //管理学院员工的类
class CollegeManage {
// 返回学院的所有员工
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id" + i);
list.add(emp);
}
return list;
} // 输出学院员工的信息
public void printEmployee() {
// 获取学院员工
List<CollegeEmployee> list1 = this.getAllEmployee();
System.out.println("------学院员工------");
for (CollegeEmployee e : list1) {
System.out.println(e.getId());
}
} } //管理学校员工的类
class SchoolManager {
// 返回学校总部的所有员工
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
Employee emp = new Employee();
emp.setId("学校总部员工" + i);
list.add(emp);
}
return list;
} void printAllEmployee(CollegeManage sub) { /*
* 分析问题 1.这里的CollegeEmployee 不是 SchoolManager的直接朋友 2.CollegeEmployee
* 是以局部变量的方式出现在 SchoolManager 3.违反了迪米特法则
*/ /*
* 解决办法 1.将输出学院的员工方法,转到CollegeEmployee
*/ sub.printEmployee(); // 获取学校总部员工
List<Employee> list2 = this.getAllEmployee();
System.out.println("------学校总部员工------");
for (Employee e : list2) {
System.out.println(e.getId());
}
}
}

上面的代码,CollegeEmployee 不是 SchoolManager的直接朋友,CollegeEmployee是以局部变量的方式出现在SchoolManager,所以违反了迪米特法则

改进代码

public class Demeter1 {
public static void main(String[] args) {
SchoolManager schoolManager = new SchoolManager();
schoolManager.printAllEmployee(new CollegeManage());
}
} //总部员工的类
class Employee {
private String id; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
}
} //学院员工的类
class CollegeEmployee {
private String id; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
}
} //管理学院员工的类
class CollegeManage {
// 返回学院的所有员工
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id" + i);
list.add(emp);
}
return list;
}
} //管理学校员工的类
class SchoolManager {
// 返回学校总部的所有员工
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
Employee emp = new Employee();
emp.setId("学校总部员工" + i);
list.add(emp);
}
return list;
} void printAllEmployee(CollegeManage sub) {
// 获取学院员工
List<CollegeEmployee> list1 = sub.getAllEmployee();
System.out.println("------学院员工------");
for (CollegeEmployee e : list1) {
System.out.println(e.getId());
} // 获取学校总部员工
List<Employee> list2 = this.getAllEmployee();
System.out.println("------学校总部员工------");
for (Employee e : list2) {
System.out.println(e.getId());
}
}
}

迪米特法则应注意的事项和细节

1、迪米特法则的核心是降低类之间的耦合

2、由于每个类都减少了不必要的依赖,因此迪米特法则知识要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系

java设计模式--迪米特法则的更多相关文章

  1. 设计模式--迪米特法则(Lod/LKP)

    迪米特法则:(Law of Demeter, LoD),也称最少知识原则(Least Knowledge Principle, LKP) 理解:      假设两个类不必彼此直接通信,那么这两个类就不 ...

  2. Java设计模式(3:接口隔离原则和迪米特法则详解)

    一.接口隔离原则 使用多个接口,而不使用单一的接口,客户端不应该依赖它不需要的接口.尽量的细化接口的职责,降低类的耦合度. 我们先来看一个例子: 小明家附近新开了一家动物园,里面有老虎.鸟儿.长颈鹿. ...

  3. 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)

    一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, function Employee(n ...

  4. 设计模式六大原则——迪米特法则(LoD)

    1.背景 在图书馆借书.刚開始的时候,直接跑到对应的楼层去,到里面去转,去找要借的书,在里面溜达半天才干找到:后来知道图书馆有一个电脑查询处.然后直接在电脑上输入想要借的书,电脑就会显示你想要借的书的 ...

  5. 设计模式之模板方法模式&&迪米特法则(代码Objective-C展示)

    模板方法模式 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变一个算法的结构即可重定义该算法的某些特定步骤. 比如说,小时候数学老师的随堂检测,都是在黑板 ...

  6. 《设计模式》-原则六:迪米特法则(LoD)

    啊哈哈哈哈,又到星期五了,真开心.回来吃完饭慌着去玩游戏,所以立马过来先完成今天的学习目标. 这个原则的命名好像是以某个人的名字命名的,算了我不去管这个了. 直接说说我学到的东西,这个迪米特法则又可以 ...

  7. ZT 设计模式六大原则(5):迪米特法则

    转贴: 设计模式六大原则(5):迪米特法则   原帖子的后续评论里面很多值得仔细去看 切记!像21楼 21楼 chenshufei2 2012-09-23 12:47发表 [回复] 上个例子,就是方法 ...

  8. IOS设计模式的六大设计原则之迪米特法则(LOD,Law Of Demeter)

    定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle).如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中的一个类需要调用 ...

  9. 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式

    1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...

随机推荐

  1. 请求参content-type的值为json,返回报错的解决方法

    如上图,请求后报参数错误 原因content-type的值为json requests.post左侧的data要改为json 即r = requests.post(url, json=data, he ...

  2. [总结]ACM模拟总结

    1.心态一定要稳,千万不要慌. 2.内部交流要多点,说不定就讨论出有用的性质了. 3.题目细节一定要想清楚. 4.一道题绝对不能让多个人来写. 5.英语要好好学.

  3. kuangbin专题专题十一 网络流 Going Home POJ - 2195

    题目链接:https://vjudge.net/problem/POJ-2195 思路:曼哈顿距离来求每个人到每个房间的距离,把距离当作费用. 就可以用最小费用最大流来解决了,把每个房子拆成两个点,限 ...

  4. Django自定义认证系统

    官网教程:https://docs.djangoproject.com/en/2.2/topics/auth/customizing/ app下的model.py from django.db imp ...

  5. phpstudy切换的php7.1版本php-cgi报错

    phpstudy切换的php7.1版本php-cgi报错 是因为没有装对应vc的插件. 下载地址:https://www.microsoft.com/zh-CN/download/details.as ...

  6. Express+MySQL实现登录注册的demo

    MySQL5.7.20 demo准备 安装MySQL,安装完毕之后添加系统环境变量在cmd中启动服务:net start mysql57,如果是安装MySQL8.0则服务名默认时mysql80,测试安 ...

  7. Centos 7 最小化部署zabbix

    前言 文章内容是作者本人编写,之前一直放在word文档中,突然有闲情转移到博客上来了,欢迎后续观看者有问题找我探讨~~~ 废话不多说,先说下原理吧 概述 工作原理 通过c/s模式采集数据,基于b/s模 ...

  8. oracle问题之SYSTEM表空间不足 (二)

    杂症二.SYSTEM表空间不足报错 一.杂症: PLSQL登录,报错: ORA-00604: 递归 SQL 层  出现错误 ORA-01653: 表.无法通过(在表空间中)扩展 ORA-02002: ...

  9. .net core3.1 web api中使用newtonsoft替换掉默认的json序列化组件

    在微软的文档中,有着较为详细的替换教程 https://docs.microsoft.com/zh-cn/aspnet/core/web-api/advanced/formatting?view=as ...

  10. The .native modifier for v-on is only valid on components but it was used on <input>

    原因 基础不牢固就是这样了,事件的native修饰符只能在组件上使用,原生的html标签是不能使用的,这是因为我在input标签使用了native修饰符.