Java设计模式-七大架构设计原则-最少知道原则(迪米特法则)

Java设计模式-七大架构设计原则-最少知道原则(迪米特法则)

从这一专栏开始将学习设计模式,上课学习和自己总结归纳的笔记将总结出来供大家参考。
参考书籍:《设计模式就该这样学》

其他文章:

Java设计模式-UML类图Java设计模式-七大架构设计原则-开闭原则
Java设计模式-七大架构设计原则-依赖倒置原则Java设计模式-七大架构设计原则-单一职责原则
Java设计模式-七大架构设计原则-接口隔离原则Java设计模式-七大架构设计原则-最少知道原则(迪米特法则)
Java设计模式-七大架构设计原则-里氏替换原则和合成复用原则Java设计模式-创建型设计模式-简单工厂模式
Java设计模式-创建型设计模式-工厂方法模式(工厂模式)Java设计模式-创建型设计模式-抽象工厂模式
Java设计模式-创建型设计模式-建造者模式Java设计模式-创建型设计模式-原型模式
Java设计模式-创建型设计模式-单例模式Java设计模式-结构型设计模式-适配器模式
Java设计模式- 结构型设计模式-享元模式Java设计模式- 结构型设计模式-外观模式
Java设计模式- 结构型设计模式-桥接模式Java设计模式-结构型模式设计模式-组合模式
Java设计模式-行为型设计模式-观察者模式

最少知道原则(迪米特法则)

最少知道原则(Least Knowledge Principle,LKP),指的是一个对象应该对其他对象保持最少了解,尽量降低类和类之间的耦合。主要强调的是只和朋友交流,不和陌生人说话。

朋友类:出现在成员变量、方法的输入输出参数中的类

非朋友类:而出现在方法体内部的类。

1.1最少知道原则的实际应用

问题背景:

现在要设计一个权限系统,TeamLeader需要查看目前发布到线上课程的数量,

但是TeamLeader不亲自统计,而是叫Employee去统计,然后让Employee把统计的结果告诉给TeamLeader。

Course类

public class Course {
    public static void main(String[] args) {
        TeamLeader teamLeader=new TeamLeader();
        Employee employee = new Employee();
        teamLeader.commandCheckNumber(employee);
    }
}

1.1.1没使用最少知道原则

Employee类

public class Employee {
    public void checkNumberOfCourse(List<Course> courseList){
        System.out.println("已发布的课程数量为:"+courseList.size());
    }
}

TeamLeader类

public class TeamLeader {
    public  void commandCheckNumber(Employee employee){
        List<Course> courseList = new ArrayList<>();
        for(int i=0;i<20;i++){
            courseList.add(new Course());
        }
        employee.checkNumberOfCourse(courseList);
    }
}

说明:

结果如下:

在这里插入图片描述

类图如下:

在这里插入图片描述

其实在这里代码功能已经实现,但是根据最少知道原则和类图来看:

TeamLeader只想要结果,不想跟Course类(非朋友类)产生直接交流。

Employee统计需要引用Course对象,TeamLeader和Course并不是朋友

1.1.2使用了最少知道原则

Employee类

public class Employee {
    public void checkNumberOfCourse(){
           List<Course> courseList=new ArrayList();
           for(int i=0;i<20;i++){
               courseList.add(new Course());
           }
            System.out.println("已发布的课程数量为:"+courseList.size());
        }
}

TeamLeader类

public class TeamLeader {
      public  void commandCheckNumber(Employee employee) {
            employee.checkNumberOfCourse();
        }
}

说明:

结果如下:

在这里插入图片描述

类图如下:

在这里插入图片描述

上图所示Course和TeamLeader已经没了关联了。


版权声明:本文为qq_29843575原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。