Беседа о шаблонах проектирования (12) – Закон Димита
Введение в столбец
Адрес столбца
Введение в столбец
В основном он анализирует и обобщает 23 распространенных шаблона дизайна, присутствующих в настоящее время на рынке, один за другим. Я надеюсь, что заинтересованные друзья смогут взглянуть на него, и он будет постоянно обновляться. Я надеюсь, что вы сможете контролировать меня, и мы сможем учиться и добиваться прогресса вместе.
Закон Деметры
Закон Деметры, также известный как принцип наименьшего знания, представляет собой принцип объектно-ориентированного проектирования, который подчеркивает, что объект должен минимизировать взаимозависимость с другими объектами.
Основная идея
Минимизируйте взаимозависимость между объектами и уменьшите связь между объектами. В частности, он подчеркивает, что объект должен взаимодействовать только со своими непосредственными друзьями, а не с незнакомыми объектами.
«Друзья» здесь относятся к
сам текущий объект
Объект может вызывать свои собственные методы, поскольку он понимает свою структуру и поведение.
Объект текущего объекта, переданный в качестве параметра
Объект может вызывать методы объекта, переданного в качестве параметра, поскольку он понимает структуру и поведение переданного объекта.
Объект, на который напрямую ссылаются переменные-члены текущего объекта.
Объект может вызывать методы объектов, на которые напрямую ссылаются его переменные-члены, поскольку он понимает структуру и поведение объектов, на которые ссылаются переменные-члены.
Цель
Уменьшите связь между объектами и улучшите удобство обслуживания, масштабируемость и возможность повторного использования системы. Ограничивая прямое взаимодействие между объектами, зависимости между объектами уменьшаются, что делает систему более гибкой, ее легче модифицировать и тестировать.
Следование закону Деметра может сделать конструкцию системы более модульной: каждому объекту нужно сосредоточиться только на своих обязанностях, не зная внутренних деталей других объектов. Это может снизить сложность системы и улучшить читаемость и удобство сопровождения кода. В то же время закон Деметры также помогает улучшить масштабируемость системы, поскольку уменьшает прямую зависимость между объектами, и при добавлении новых функций необходимо модифицировать лишь небольшое количество объектов.
реализация 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());
}
}
}
}
анализ программы
Отношения между классом учеников, классом класса и школьным классом соответствуют закону Деметры. Класс ученика напрямую связан только с классом класса, класс класса напрямую связан только со школьным классом, и между классом ученика и школьным классом нет прямой связи. Это может уменьшить связь между объектами и повысить гибкость и удобство обслуживания системы.
В клиентском коде мы создаем объект школы, затем получаем объект класса и объект ученика через объект школы и выводим их информацию. Благодаря закону Димита мы видим, что клиентскому коду необходимо взаимодействовать только со школьным классом и не нужно знать внутренние детали класса и класса учащихся. Это может уменьшить прямую зависимость клиентского кода от других классов. и сделать систему более эффективной, гибкой и простой в обслуживании.
Подведем итог
Закон Деметра подчеркивает слабую связь между объектами, что повышает гибкость и удобство обслуживания системы за счет уменьшения прямых зависимостей между объектами. Следование закону Деметра может сделать систему более модульной, масштабируемой и тестируемой.