栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

搞定设计模式之迪米特法则一篇文章就够了!!!

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

搞定设计模式之迪米特法则一篇文章就够了!!!

文章目录
    • 一、定义
    • 二、示例问题
    • 三、问题改进

一、定义

迪米特法则(Law of Demeter,LoD)又称为最少知道原则(LeastKnowledge Principle,LKP),是指一个对象类对于其他对象类来说,知道得越少越好。

也就是说,两个类之间不要有过多的耦合关系,保持最少关联性。

迪米特法则有一句经典语录:只和朋友通信,不和陌生人说话。

也就是说,有内在关联的类要内聚,没有直接关系的类要低耦合。

这样的例子在我们生活中也随处可见,就像家里的水管装修,有洗衣机地漏、卫生间地漏、厨房地漏,但它们最终都汇到同一个污水处理系统里。

在平常使用时,我们不会考虑这些水管是怎么关联流向的,只需要考虑最上层的使用即可。

二、示例问题

老师需要负责具体某一个学生的学习情况,而校长会关心老师所在班级的总体成绩,不会过问具体某一个学生的学习情况。

如果校长想知道一个班级的总分和平均分,是应该找老师要,还是跟每一个学生要再进行统计呢?显然是应该找具体的班主任老师。我们在实际开发时,容易忽略这样的真实情况,开发出逻辑错误的程序。

首先定义一个学生信息类,这个类比较简单,包括学生姓名、考试排名、总分。在实际的业务开发中会更复杂,这里只是简化后的类。

@Data
public class Student {
    // 姓名
    private String name;
    // 排名
    private int rank;
    // 总分
    private double grade;

    public Student(String name, int rank, double grade) {
        this.name = name;
        this.rank = rank;
        this.grade = grade;
    }
}

之后再定义出老师类,在老师类里初始化学生的信息,以及提供基本的信息获取接口。

public class Teacher {
    private String name;
    private String clazz;
    private static List studentList;

    public Teacher() {
    }

    public Teacher(String name, String clazz) {
        this.name = name;
        this.clazz = clazz;
    }

    static {
        studentList = new ArrayList<>();
        studentList.add(new Student("s1", 10, 345));
        studentList.add(new Student("s2", 20, 245));
        studentList.add(new Student("s3", 30, 145));
        studentList.add(new Student("s4", 40, 45));
    }

    public List getStudentList() {
        return studentList;
    }

    public String getName() {
        return name;
    }

    public String getClazz() {
        return clazz;
    }
}

在老师类中初始化了学生信息,同时提供了简单的接口。接下来定义校长类,校长管理全局,并在校长类中获取学生人数、总分、平均分等。

public class Principal {
    private Teacher teacher = new Teacher("t1", "1年级1班");

    public Map queryClazzInfo(String clazzId) {
        Map map = new HashMap<>();
        map.put("班级", teacher.getClazz());
        map.put("老师姓名", teacher.getName());
        map.put("总分", totalScore());
        return map;
    }

    public double totalScore() {
        double totalScore = 0;
        for (Student stu : teacher.getStudentList()) {
            totalScore += stu.getGrade();
        }
        return totalScore;
    }
}

以上就是通过校长管理所有学生,老师只提供了非常简单的信息。

虽然可以查询到结果,但是违背了迪米特法则,因为校长需要了解每个学生的情况。如果所有班级都让校长类统计,代码就会变得非常臃肿,也不易于维护和扩展

三、问题改进

从以上的实现方式我们发现,不该让校长直接管理学生,校长应该管理老师,由老师提供相应的学生信息查询服务。

那么,接下来我们就把校长要的信息交给老师类去处理。

在使用迪米特法则后,把原来违背迪米特法则的服务接口交给老师类处理。

这样每一位老师都会提供相应的功能,校长类只需要调用使用即可,而不需要了解每一位学生的分数。


校长类直接调用老师类的接口,并获取相应的信息。

这样一来,整个功能逻辑就非常清晰了。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/309980.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号