• Java设计模式 | 七大原则之迪米特法则


    在这里插入图片描述

    基本介绍

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

    应用实例

    1. 有一个学校,下属有各个学院和总部,现要求打印出学校总部员工ID和学院员工ID
    /**
     * Created with IntelliJ IDEA.
     * User: Mingda
     * Time: 2024/2/28 15:22
     * File: Demeter1
     * Description: 迪米特法则
     */
    public class Demeter1 {
    
        public static void main(String[] args) {
            SchoolManager schoolManager = new SchoolManager();
            // 输出学校总部和学院员工信息
            schoolManager.printAllEmployee(new CollegeEmployeeManager());
        }
    }
    
    // 学校总部员工类
    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 CollegeEmployeeManager {
        public List<CollegeEmployee> getAllEmployee() {
            // 返回学院的所有员工
            List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
            for (int i = 0; i < 10; i++) {
                CollegeEmployee collegeEmployee = new CollegeEmployee();
                collegeEmployee.setId("学院员工ID:" + i);
                list.add(collegeEmployee);
            }
            return list;
        }
    }
    
    // 学校员工管理类
    // 分析:
    // 直接朋友:Employee、CollegeEmployeeManager
    // CollegeEmployee不是直接朋友,违反了迪米特法则(以局部变量的形式出现在SchoolManager类)
    class SchoolManager {
        // 返回学校总部的所有员工
        public List<Employee> getAllEmployee() {
            List<Employee> list = new ArrayList<Employee>();
            for (int i = 0; i < 10; i++) {
                Employee employee = new Employee();
                employee.setId("学校总部员工ID:" + i);
                list.add(employee);
            }
            return list;
        }
    
        // 输出学校总部和学院员工信息
        void printAllEmployee(CollegeEmployeeManager sub) {
            // 获取到学院员工
            List<CollegeEmployee> list1 = sub.getAllEmployee();
            System.out.println("学院员工信息:" + list1);
            for (CollegeEmployee e : list1) {
                System.out.println(e.getId());
            }
    
            // 获取到学校总部员工
            List<Employee> list2 = this.getAllEmployee();
            System.out.println("学校总部员工信息:" + list2);
            for (Employee e : list2) {
                System.out.println(e.getId());
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89

    改进:

    /**
     * Created with IntelliJ IDEA.
     * User: Mingda
     * Time: 2024/2/28 15:22
     * File: Demeter1
     * Description: 迪米特法则(改进)
     */
    public class Demeter1 {
    
        public static void main(String[] args) {
            SchoolManager schoolManager = new SchoolManager();
            // 输出学校总部和学院员工信息
            schoolManager.printAllEmployee(new CollegeEmployeeManager());
        }
    }
    
    // 学校总部员工类
    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 CollegeEmployeeManager {
        public List<CollegeEmployee> getAllEmployee() {
            // 返回学院的所有员工
            List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
            for (int i = 0; i < 10; i++) {
                CollegeEmployee collegeEmployee = new CollegeEmployee();
                collegeEmployee.setId("学院员工ID:" + i);
                list.add(collegeEmployee);
            }
            return list;
        }
    
        // 输出学院员工信息
        public void printEmployee() {
            List<CollegeEmployee> list1 = getAllEmployee();
            System.out.println("学院员工信息:" + list1);
            for (CollegeEmployee e : list1) {
                System.out.println(e.getId());
            }
        }
    }
    
    // 学校员工管理类
    // 分析:
    // 直接朋友:Employee、CollegeEmployeeManager
    // CollegeEmployee不是直接朋友,违反了迪米特法则(以局部变量的形式出现在SchoolManager类)
    class SchoolManager {
        // 返回学校总部的所有员工
        public List<Employee> getAllEmployee() {
            List<Employee> list = new ArrayList<Employee>();
            for (int i = 0; i < 10; i++) {
                Employee employee = new Employee();
                employee.setId("学校总部员工ID:" + i);
                list.add(employee);
            }
            return list;
        }
    
        // 输出学校总部和学院员工信息
        void printAllEmployee(CollegeEmployeeManager sub) {
            /*// 获取到学院员工
            List list1 = sub.getAllEmployee();
            System.out.println("学院员工信息:" + list1);
            for (CollegeEmployee e : list1) {
                System.out.println(e.getId());
            }*/
    
            // 分析问题:将输出学院员工方法,封装到CollegeEmployeeManager类中
            sub.printEmployee();
    
            // 获取到学校总部员工
            List<Employee> list2 = this.getAllEmployee();
            System.out.println("学校总部员工信息:" + list2);
            for (Employee e : list2) {
                System.out.println(e.getId());
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101

    注意事项和细节

    1. 迪米特法则的核心是降低类之间的耦合
    2. 注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)的耦合关系,并不是要求完全没有依赖

    github笔记

  • 相关阅读:
    保密资质申报条件
    【Python百宝箱】图解未来:数据可视化引领智慧决策时代
    van-uploader上传图片报错Invalid handler for event “load“(在uniapp编译)
    生命在于折腾——皮卡丘靶场源码审计(一)
    不依赖vue实例,怎么实现一个eventBus?
    决策树oo
    C#__基本的读写文件方式
    DAP数据加工流程梳理
    uniapp 微信小程序和h5处理文件(pdf)下载+保存到本地+预览功能
    深入理解RocketMQ 广播消费
  • 原文地址:https://blog.csdn.net/weixin_52164430/article/details/136348624