迪米特原则

基本介绍

定义:迪米特法则也称为最少知识原则,即一个对象应该对其他对象有最少的了解。通俗地说,一个类应该对自己需要耦合或调用的类知道的最少,被调用或耦合的类的内部是如何复杂都和我没有关系。
一个类只需要知道人家提供多少public方法,我就调用多少,其他的一概不关心。
核心观念-》类间解耦
迪米特法则对类的低耦合提出了明确的要求,包含以下4层含义:
①只和朋友交流:
迪米特法则的另一个解释是:是与直接的朋友通信
朋友关系是什么:每个对象必然会与其他对象有耦合关系,两个对象之间的耦合关系就成为朋友关系,这种关系的类型有很多,例如组合、聚合、依赖等。
直接朋友是什么?出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类
②朋友之间也是有距离的:
一个类公开的public属性或者方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。所以,在设计时要反复衡量:是否换可以再减少public方法和属性,是否可以修改为private、protected等访问权限,是否可以加上final关键字。
③是自己的就是自己的
如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,那就放在本类中
package com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;public class Demeter1 {public static void main(String[] args) {SchoolManager schoolManager=new SchoolManager();schoolManager.printAllEmployee(new CollegeManager());}
}
/*
* 学校总部员工
* */
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 CollegeManager{/** 返回学院的所有员工* */public List<CollegeEmployee> getAllEmployee(){ArrayList<CollegeEmployee> list=new ArrayList<>();//模拟10个学院员工for (int i=0;i<10;i++){CollegeEmployee collegeEmployee=new CollegeEmployee();collegeEmployee.setId("学院员工id="+i);list.add(collegeEmployee);}return list;}}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{/** 返回学校总部的所有员工* */public List<Employee> getAllEmployee(){ArrayList<Employee> list=new ArrayList<>();//模拟10个学院员工for (int i=0;i<10;i++){Employee employee=new Employee();employee.setId("学校总部的员工id="+i);list.add(employee);}return list;}public void printAllEmployee(CollegeManager collegeManager){//打印学校和学院的所有员工List<CollegeEmployee> list1=collegeManager.getAllEmployee();System.out.println("============学院员工============");for (CollegeEmployee collegeEmployee : list1) {System.out.println(collegeEmployee);}List<Employee> list2=this.getAllEmployee();System.out.println("============学校总部员工============");for (Employee employee : list2) {System.out.println(employee);}}
}

1、分析SchoolManager的直接朋友:
成员变量、方法参数、方法返回值
Employee、CollegeManager是CollegeEmployee不是成员变量,不是方法参数,不是返回值是以局部变量的方式出现在SchoolManager中
2、总结:问题主要出现在SchoolManager类的printAllEmployee方法中使用了CollegeEmployee类,这里的CollegeEmployee类是非朋友关系,违反了迪米特法则
修改:

package com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;public class Demeter1 {public static void main(String[] args) {}
}
/*
* 学校总部员工
* */
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 CollegeManager{/** 返回学院的所有员工* */public List<CollegeEmployee> getAllEmployee(){ArrayList<CollegeEmployee> list=new ArrayList<>();//模拟10个学院员工for (int i=0;i<10;i++){CollegeEmployee collegeEmployee=new CollegeEmployee();collegeEmployee.setId("学院员工id="+i);list.add(collegeEmployee);}return list;}/*** 将原来在SchoolManager中的代码提取到自己类中*/public void printEmployee(){List<CollegeEmployee> list1=this.getAllEmployee();System.out.println("============学院员工============");for (CollegeEmployee collegeEmployee : list1) {System.out.println(collegeEmployee);}}
}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{/** 返回学校总部的所有员工* */public List<Employee> getAllEmploypackage com.cxq.demeter;
import java.util.ArrayList;
import java.util.List;public class Demeter1 {public static void main(String[] args) {SchoolManager schoolManager=new SchoolManager();schoolManager.printAllEmployee(new CollegeManager());}
}
/*
* 学校总部员工
* */
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 CollegeManager{/** 返回学院的所有员工* */public List<CollegeEmployee> getAllEmployee(){ArrayList<CollegeEmployee> list=new ArrayList<>();//模拟10个学院员工for (int i=0;i<10;i++){CollegeEmployee collegeEmployee=new CollegeEmployee();collegeEmployee.setId("学院员工id="+i);list.add(collegeEmployee);}return list;}/*** 将原来在SchoolManager中的代码提取到自己类中*/public void printEmployee(){List<CollegeEmployee> list1=this.getAllEmployee();System.out.println("============学院员工============");for (CollegeEmployee collegeEmployee : list1) {System.out.println(collegeEmployee);}}
}
/*
* 管理学校员工的类
* 分析出那些类不是SchoolManager的直接朋友
* 1、collegeEmployee不是直接朋友
* */
class SchoolManager{/** 返回学校总部的所有员工* */public List<Employee> getAllEmployee(){ArrayList<Employee> list=new ArrayList<>();//模拟10个学院员工for (int i=0;i<10;i++){Employee employee=new Employee();employee.setId("学校总部的员工id="+i);list.add(employee);}return list;}public void printAllEmployee(CollegeManager collegeManager){//打印学校和学院的所有员工collegeManager.printEmployee();List<Employee> list2=this.getAllEmployee();System.out.println("============学校总部员工============");for (Employee employee : list2) {System.out.println(employee);}}
}

设计模式:六大原则之迪米特原则相关推荐

  1. 软件设计原则之接口隔离原则、合成复用原则、迪米特原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.接口隔离原则 什么是接口 ...

  2. 设计原则之迪米特原则

    迪米特原则 Law of Demeter, LOD 迪米特原则定义 迪米特原则也叫最小知识原则(The Least Knowledge Principle).即,每个模块只应该了解那些与它关系密切的模 ...

  3. 面向对象的六大原则之 —— 迪米特原则

    学习了何红辉.关爱民写的<Android设计模式>,对于面向对象的六大原则有进一步的理解,特此根据自己的理解记录总结一下 什么是迪米特原则 也称为最少知识原则,意思就是一个对象应该对其他对 ...

  4. 学习设计模式 - 六大基本原则之接口隔离原则

    设计模式总共有六大基本原则,统称为SOLID (稳定)原则,分别是S-单一职责原则(Single Responsibility Principle), O-开闭原则(Open closed Princ ...

  5. 六大设计原则之迪米特原则

    迪米特原则的定义 迪米特原则(Law of Demeter,LoD),也叫最少知识原则(Low knowledge Principle,LKP): 一个对象应该对其他对象有最少的了解. 通俗的讲:一个 ...

  6. 【学习笔记】慕课网—Java设计模式精讲 第3章 软件设计七大原则-3-6 迪米特原则(最少知道原则)...

    /** * 软件设计七大原则-迪米特原则 学习笔记 * @author cnRicky * @date 2018.11.10 */ 迪米特原则(最少知道原则) 一个对象应该对其他对象保持最少的了解.又 ...

  7. 设计模式-设计原则之迪米特原则

    例子 假设老板给项目组长下达一个任务,让其去查询课程的数量 代码 public class Course {} public class TeamLeader {public void checkNu ...

  8. C# 设计原则 之 迪米特 原则

    迪米特法则又叫作最少知道原则,一般设计用于 对类内部 进行 合适的封装. 下面举例: 人关闭电脑的 示例 1.1没有实现 迪米特原则的 代码 namespace 迪米特 {internal class ...

  9. 程序设计原则之迪米特原则

    一.什么是迪米特原则 迪米特原则也叫最小知道原则,即对其他的类尽量保持最少知道.只关心自己的直接朋友类,而不关心其他的类. 直接朋友类:出现在自己的域中.方法入参中.方法出参中的类叫直接朋友类:那些在 ...

最新文章

  1. 题目1493:公约数
  2. Leetcode-探索 | 存在重复
  3. 计算机与图像处理论文标题,数字图像处理论文各种题目.doc
  4. JQuery与CSS相结合的下拉框
  5. 怎么切换用户_走进通信:4G手机跟基站是怎么“交流”的
  6. 先验概率与后验概率、贝叶斯区别与联系
  7. C# 使用Awaiter
  8. Lua协程Coroutine是什么
  9. 2019年招聘过程的种种酸甜苦辣历程
  10. 简化document.createElement(div)动态生成层方法
  11. Android模拟器
  12. 360二代抢票神器 v7.1.1.502 官方版
  13. 抖音视频评论获取系统,获取抖音评论的系统
  14. ATTINY85 和 ATTINY84 与arduino的对应引脚
  15. 成长路线 - Android移动开发架构师
  16. .Net Standard 2.1对您意味着什么
  17. 需求与商业模式创新-需求2-需求基础
  18. 数据中心服务器部署,数据中心服务器接入部署的布线方式
  19. artTemplate模板引擎
  20. linux pam mysql,Linux-PAM PAM-MySQL的总结

热门文章

  1. 从“搜索挑战”,看字节跳动的自我暴露之路
  2. java 下溯造型_Java 的上溯造型和下溯造型以及举例,以及判断参数等指向的类
  3. react history
  4. 【创作赢红包】Python第3章 流程控制
  5. python显示数学符号_Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法...
  6. 谷歌与DIRECTV达成合作在电视节目中销售广告
  7. n战routing终于没有白买netflix
  8. 网络爬虫ip防止被封常见的三种解决方法
  9. 解决html在微信浏览器无法调用图片浏览器
  10. 中国氢氧化钡行业研究与投资战略报告(2021版)