设计模式七大原则——迪米特原则

设计模式七大原则——迪米特原则1 什么是迪米特原则 一个对象应该对其他对象保持最少的了解 类与类关系越密切 耦合度越大 迪米特法则 DemeterPrinc 又叫最少知道原则 即一个类对自己依赖的类知道的越少越好 也就是说 对于被依赖的类不管多么复杂 都尽量将逻辑封装在类的内部 对外除了提供的 public 方法 不对外泄露任何信息 迪米特法则还有个更简单的定义 只与直接的朋友通信 直接的朋友 每个对象都会与其他对象有耦合关系 只要两个对象之间有耦合关系 我们就说这两个对象之间是朋友关系 耦合的方式很多 依赖

1.什么是迪米特原则?

  1. 一个对象应该对其他对象保持最少的了解。
  2. 类与类关系越密切,耦合度越大。
  3. 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public方法,不对外泄露任何信息。
  4. 迪米特法则还有个更简单的定义:只与直接的朋友通信。
  5. 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

2.违反迪米特原则代码案例

代码中的注释我已经写的很详细了,大家有问题即可指出。

package com.szh.principle.demeter; import java.util.ArrayList; import java.util.List; / * */ //学校总部员工类 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 
   
     getAllEmployee() { List 
    
      list = new ArrayList<>(); for (int i = 1; i <= 5; i++) { //这里我们增加了5个员工到 list CollegeEmployee emp = new CollegeEmployee(); emp.setId("学院员工id= " + i); list.add(emp); } return list; } } //学校管理类 //分析 SchoolManager 类的直接朋友类有哪些: Employee、CollegeManager //CollegeEmployee 不是 直接朋友, 而是一个陌生类, 这样违背了 迪米特法则 class SchoolManager { //返回学校总部的员工 public List 
     
       getAllEmployee() { List 
      
        list = new ArrayList<>(); for (int i = 1; i <=3 ; i++) { //这里我们增加了3个员工到 list Employee emp = new Employee(); emp.setId("学校总部员工id= " + i); list.add(emp); } return list; } //该方法完成输出学校总部和学院员工信息(id) void printAllEmployee(CollegeManager sub) { //分析问题 //1. 这里的 CollegeEmployee 不是 SchoolManager 的直接朋友 //2. CollegeEmployee 是以局部变量方式出现在 SchoolManager //3. 违反了 迪米特法则 //获取到学院员工 List 
       
         list1 = sub.getAllEmployee(); System.out.println("------------学院员工------------"); list1.stream().map(CollegeEmployee::getId).forEach(System.out::println); //获取到学校总部员工 List 
        
          list2 = this.getAllEmployee(); System.out.println("------------学校总部员工------------"); list2.stream().map(Employee::getId).forEach(System.out::println); } } public class Demeter { public static void main(String[] args) { //创建了一个 SchoolManager 对象 SchoolManager schoolManager = new SchoolManager(); //输出学院的员工id 和 学校总部的员工信息 schoolManager.printAllEmployee(new CollegeManager()); } } 
         
        
       
      
     
   

设计模式七大原则——迪米特原则


3.遵守迪米特原则代码案例

前面设计的问题在于SchoolManager 中,CollegeEmployee 类并不是SchoolManager类的直接朋友。

按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合。我们将上面的代码进行修改,使其遵守迪米特原则。

package com.szh.principle.demeter.improve; import java.util.ArrayList; import java.util.List; / * */ //学校总部员工类 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 
    
      getAllEmployee() { List 
     
       list = new ArrayList<>(); for (int i = 1; i <= 5; i++) { //这里我们增加了5个员工到 list CollegeEmployee emp = new CollegeEmployee(); emp.setId("学院员工id= " + i); list.add(emp); } return list; } //输出学院员工的信息 public void printEmployee() { //获取到学院员工 List 
      
        list1 = getAllEmployee(); System.out.println("------------学院员工------------"); list1.stream().map(CollegeEmployee::getId).forEach(System.out::println); } } //学校管理类 //分析 SchoolManager 类的直接朋友类有哪些: Employee、CollegeManager //CollegeEmployee 不是 直接朋友, 而是一个陌生类, 这样违背了 迪米特法则 class SchoolManager { //返回学校总部的员工 public List 
       
         getAllEmployee() { List 
        
          list = new ArrayList<>(); for (int i = 1; i <= 3; i++) { //这里我们增加了3个员工到 list Employee emp = new Employee(); emp.setId("学校总部员工id= " + i); list.add(emp); } return list; } //该方法完成输出学校总部和学院员工信息(id) void printAllEmployee(CollegeManager sub) { //分析问题 //改进代码:将输出学院的员工方法,封装到CollegeManager sub.printEmployee(); //获取到学校总部员工 List 
         
           list2 = getAllEmployee(); System.out.println("------------学校总部员工------------"); list2.stream().map(Employee::getId).forEach(System.out::println); } } public class Demeter { public static void main(String[] args) { System.out.println("~~~使用迪米特法则的改进~~~"); //创建了一个 SchoolManager 对象 SchoolManager schoolManager = new SchoolManager(); //输出学院的员工id 和 学校总部的员工信息 schoolManager.printAllEmployee(new CollegeManager()); } } 
          
         
        
       
      
    

设计模式七大原则——迪米特原则


4.迪米特原则的注意事项

  1. 迪米特法则的核心是降低类之间的耦合。
  2. 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/203740.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午9:42
下一篇 2026年3月19日 下午9:42


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号