前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式原则:迪米特法则

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

作者头像
运维开发王义杰
发布2023-08-10 14:43:06
1930
发布2023-08-10 14:43:06
举报
文章被收录于专栏:运维开发王义杰

迪米特法则

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

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

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

举个例子,假设我们有一个学校类 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();
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 迪米特法则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档