| 1) 一个对象应该对其他对象保持最少的了解 |
| 2) 类与类关系越密切,耦合度越大 |
| 3) 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对外泄露任何信息 |
| 4) 迪米特法则还有个更简单的定义:只与直接的朋友通信 |
| 5) 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友, |
| 而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部 |
| #有一个学校,下属有各个学院和总部,现要求打印出学校总部员工ID和学院员工的id |
| |
| package com.atguigu.principle.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 void setId(String id) { |
| this.id = id; |
| } |
| |
| public String getId() { |
| return id; |
| } |
| } |
| |
| |
| class CollegeEmployee { |
| private String id; |
| |
| public void setId(String id) { |
| this.id = id; |
| } |
| |
| public String getId() { |
| return id; |
| } |
| } |
| |
| |
| class CollegeManager { |
| |
| 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("学校总部员工id= " + i); |
| list.add(emp); |
| } |
| return list; |
| } |
| |
| |
| void printAllEmployee(CollegeManager 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) 前面设计的问题在于SchoolManager中,CollegeEmployee类并不是SchoolManager类的直接朋友 |
| 2) 按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合 |
| package com.atguigu.principle.demeter.improve; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| |
| public class Demeter1 { |
| public static void main(String[] args) { |
| System.out.println("~~~使用迪米特法则的改进~~~"); |
| |
| SchoolManager schoolManager = new SchoolManager(); |
| |
| schoolManager.printAllEmployee(new CollegeManager()); |
| } |
| } |
| |
| |
| class Employee { |
| private String id; |
| |
| public void setId(String id) { |
| this.id = id; |
| } |
| |
| public String getId() { |
| return id; |
| } |
| } |
| |
| |
| |
| class CollegeEmployee { |
| private String id; |
| |
| public void setId(String id) { |
| this.id = id; |
| } |
| |
| public String getId() { |
| return id; |
| } |
| } |
| |
| |
| class CollegeManager { |
| |
| 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 = 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("学校总部员工id= " + i); |
| list.add(emp); |
| } |
| return list; |
| } |
| |
| |
| void printAllEmployee(CollegeManager sub) { |
| |
| |
| sub.printEmployee(); |
| |
| List<Employee> list2 = this.getAllEmployee(); |
| System.out.println("------------学校总部员工------------"); |
| for (Employee e : list2) { |
| System.out.println(e.getId()); |
| } |
| } |
| |
| } |
| 1) 迪米特法则的核心是降低类之间的耦合 |
| 2) 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系, 并不是要求完全没有依赖关系 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?