设计模式原则:迪米特法则

2023-08-10 14:43:06 浏览数 (1)

迪米特法则

迪米特法则表示一个对象应该对其他对象保持最少的了解。也就是说,一个类应该只和它的直接朋友交流,而不和它的间接朋友交流。直接朋友指的是成员变量、方法参数、方法返回值等类型的对象,间接朋友指的是局部变量、临时变量等类型的对象。

迪米特法则是面向对象设计的重要原则之一,它体现了类之间的松耦合和高内聚。如果一个软件能够遵循迪米特法则,那么它就具有以下两个优点:

  • 降低了类之间的耦合性,提高了系统的可维护性。
  • 隐藏了类之间的细节信息,提高了代码的可读性和安全性。

举个例子,假设我们有一个学校类 School,它有一个方法 printAllTeacherNames(),表示打印出所有老师的名字。然后我们定义了一个老师类 Teacher 和一个学生类 Student 来作为学校的成员。School 类依赖于 Teacher 类和 Student 类,代码如下:

代码语言:javascript复制
class Teacher {
    private String name;

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

    public String getName() {
        return name;
    }
}

class Student {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class School {
    private List<Teacher> teachers;
    private List<Student> students;

    public School(List<Teacher> teachers, List<Student> students) {
        this.teachers = teachers;
        this.students = students;
    }

    public void printAllTeacherNames() {
        for (Teacher teacher : teachers) {
            System.out.println(teacher.getName());
        }
    }
}

这个类违反了迪米特法则,因为它访问了 Teacher 类的内部信息,即 getName() 方法。这样的设计有以下几个缺点:

  • 类之间的耦合度高,如果 Teacher 类发生变化,就需要修改 School 类的代码。
  • 代码的可读性和安全性差,因为 School 类暴露了 Teacher 类的细节信息。
  • 代码的灵活性差,如果我们想要打印出其他信息,比如老师的年龄、学历等,就需要修改 School 类和 Teacher 类的代码。

为了遵循迪米特法则,我们应该将 Teacher 类的 getName() 方法封装在 Teacher 类内部,并让 School 类只调用 Teacher 类的 printName() 方法。这样,在程序中可以让 School 类只和 Teacher 类交流,而不访问其内部信息。代码如下:

代码语言:javascript复制
class Teacher {
    private String name;

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

    public void printName() {
        System.out.println(name);
    }
}

class Student {
    private String name;

    public Student(String name) {
        this.name = name;
    }

    public void printName() {
        System.out.println(name);
    }
}

class School {
    private List<Teacher> teachers;
    private List<Student> students;

    public School(List<Teacher> teachers, List<Student> students) {
        this.teachers = teachers;
        this.students = students;
    }

    public void printAllTeacherNames() {
        for (Teacher teacher : teachers) {
            teacher.printName();
        }
    }
}

0 人点赞