软件架构设计原则--迪米特原则

2022-12-02 10:20:31 浏览数 (1)

本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删

  迪米特原则(Law of Demeter,LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合度。   迪米特原则主要强调:只和朋友交流,不与陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以被称为成员朋友类,二出现在方法体内部的类不属于朋友类。   假设现在来设计一个权限系统,Boss需要查看目前发布到线上的课程数量。这时,Boss要找到Leader去统计,leader再把统计结果告诉boss,还是以代码讲解: 课程Course类:

代码语言:javascript复制
public class Course {
}

leader类:

代码语言:javascript复制
public class Leader {
    public void checkNumberCourse(List<Course> courseList){
        System.out.println("目前已发布的课程数量是:" courseList.size());
    }
}

Boss类:

代码语言:javascript复制
public class Boss {
    public void commandCheckNumber(Leader leader){
        //模拟翻页查阅,leader实时统计
        List<Course> courseList = new ArrayList<>();
        for (int i = 0; i < 20; i  ) {
            courseList.add(new Course());
        }
        leader.checkNumberCourse(courseList);
    }
}

执行:

代码语言:javascript复制
public class Main {
    public static void main(String[] args) {
        Boss boss = new Boss();
        Leader leader = new Leader();
        boss.commandCheckNumber(leader);
    }
}

  写到这里,功能其实已经实现,代码看上去好像也没什么问题。   根据迪米特原则,Boss只想要结果,不需要跟Course直接交流。而Leader统计需要引入Course对象。Boss和Course并不是朋友,但好像还有一点关联,让我们再更改一下 Boss类:

代码语言:javascript复制
public class Boss {
    public void commandCheckNumber(Leader leader){
        leader.checkNumberCourse();
    }
}

Leader类:

代码语言:javascript复制
public class Leader {
    public void checkNumberCourse(){
        List<Course> courseList = new ArrayList<>();
        for (int i = 0; i < 20; i  ) {
            courseList.add(new Course());
        }
        System.out.println("目前已发布的课程数量是:" courseList.size());
    }
}

  这时,Boss类已经与Course没有任何直接关联了。   另外,学习软件设计原则,不能形成强迫症。碰到业务负责的场景,需要随机应变。

0 人点赞