专栏介绍
专栏地址
http://t.csdnimg.cn/VpriY
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
迪米特法则
迪米特法则(Law of Demeter)也被称为最少知识原则(Least Knowledge Principle),是一种面向对象设计的原则,它强调一个对象应该尽量减少与其他对象之间的相互依赖。
核心思想
尽量减少对象之间的相互依赖,使对象之间的耦合度降低。具体来说,它强调一个对象应该只与其直接的朋友进行交互,而不与陌生的对象进行直接交互。
这里的“朋友”指
当前对象本身
一个对象可以调用自身的方法,因为它对自身的结构和行为是了解的。
以参数形式传入当前对象的对象
一个对象可以调用作为参数传入的对象的方法,因为它对传入的对象的结构和行为是了解的。
当前对象的成员变量直接引用的对象
一个对象可以调用它的成员变量直接引用的对象的方法,因为它对成员变量引用的对象的结构和行为是了解的。
目标
降低对象之间的耦合度,提高系统的可维护性、可扩展性和可复用性。通过限制对象之间的直接交互,减少了对象之间的依赖关系,使系统更加灵活、易于修改和测试。
遵循迪米特法则可以使系统的设计更加模块化,每个对象只需要关注自身的职责,而不需要了解其他对象的内部细节。这样可以降低系统的复杂性,提高代码的可读性和可维护性。同时,迪米特法则也有助于提高系统的可扩展性,因为减少了对象之间的直接依赖,新增功能时只需要修改少量的对象即可。
Java程序实现
// 定义一个学生类 class Student { private String name; public Student(String name) { this.name = name; } public String getName() { return name; } } // 定义一个班级类 class Class { private String className; private List<Student> students; public Class(String className, List<Student> students) { this.className = className; this.students = students; } public String getClassName() { return className; } public List<Student> getStudents() { return students; } } // 定义一个学校类 class School { private String schoolName; private List<Class> classes; public School(String schoolName, List<Class> classes) { this.schoolName = schoolName; this.classes = classes; } public String getSchoolName() { return schoolName; } public List<Class> getClasses() { return classes; } } // 客户端代码 public class Main { public static void main(String[] args) { // 创建学生对象 Student student1 = new Student("Tom"); Student student2 = new Student("Jerry"); // 创建班级对象 List<Student> students = new ArrayList<>(); students.add(student1); students.add(student2); Class class1 = new Class("Class1", students); // 创建学校对象 List<Class> classes = new ArrayList<>(); classes.add(class1); School school = new School("School1", classes); // 输出学校的名称和班级的名称 System.out.println("School Name: " + school.getSchoolName()); for (Class c : school.getClasses()) { System.out.println("Class Name: " + c.getClassName()); } // 输出班级中的学生姓名 for (Class c : school.getClasses()) { for (Student s : c.getStudents()) { System.out.println("Student Name: " + s.getName()); } } } }
程序分析
学生类、班级类和学校类之间的关系是符合迪米特法则的。学生类只与班级类有直接的关联,班级类只与学校类有直接的关联,而学生类和学校类之间没有直接的关联。这样可以降低对象之间的耦合度,提高系统的灵活性和可维护性。
在客户端代码中,我们创建了一个学校对象,然后通过学校对象获取班级对象和学生对象,并输出它们的信息。通过迪米特法则,我们可以看到客户端代码只需要与学校类进行交互,而不需要了解班级类和学生类的内部细节,这样可以降低客户端代码与其他类的直接依赖,使系统更加灵活和易于维护。
总结
迪米特法则强调了对象之间的松耦合设计,通过减少对象之间的直接依赖,提高系统的灵活性和可维护性。遵循迪米特法则可以使系统更加模块化、可扩展和易于测试。