迪米特法则~

简介: 迪米特法则~

迪米特法则是面向对象设计中的一个原则,它的目标是减少对象之间的直接依赖关系,它强调一个对象应该尽量减少与其他对象之间的直接交互,只与自己的直接朋友进行通信,(所谓对象之间的朋友关系就是耦合关系,耦合的方式有很多:依赖、关联、组合,聚合等等。我们称出现成员变量,方法参数,方法返回值中的类为直接朋友,而出现在局部变量中的类不是直接朋友),这样可以避免一个对象过度了解其他对象的内部结构,从而减少代码的耦合性和依赖性,提高代码的可维护性,降低系统的复杂性,并且方便进行单元测试和重构。

举例:

我们分别创建student,class,school,student和class之间建立直接朋友关系,school和class之间建立直接朋友关系,而student和school之间并没交互关系,减少了类之间的耦合度

package druidResources;
import java.util.ArrayList;
import java.util.List;
// 学生类
class Student {
    private String name;
    public Student(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
// 班级类
class Class {
  //实现班级和学生交互
    private List<Student> students;
    public Class() {
        students = new ArrayList<>();
    }
    public void addStudent(Student student) {
        students.add(student);
    }
    public List<Student> getStudents() {
        return students;
    }
}
// 学校类
class School {
  //实现班级和学校交互
    private List<Class> classes;
    public School() {
        classes = new ArrayList<>();
    }
    public void addClass(Class clazz) {
        classes.add(clazz);
    }
    // 获取学校中所有学生的姓名
    public List<String> getAllStudentNames() {
        List<String> names = new ArrayList<>();
        for (Class clazz : classes) {
            for (Student student : clazz.getStudents()) {
                names.add(student.getName());
            }
        }
        return names;
    }
}
public class LawOfDemeter {
    public static void main(String[] args) {
        // 创建学校对象
        School school = new School();
        // 创建班级对象
        Class class1 = new Class();
        Class class2 = new Class();
        // 创建学生对象
        Student student1 = new Student("张三");
        Student student2 = new Student("李四");
        Student student3 = new Student("王五");
        // 添加学生到班级
        class1.addStudent(student1);
        class1.addStudent(student2);
        class2.addStudent(student3);
        // 添加班级到学校
        school.addClass(class1);
        school.addClass(class2);
        // 获取学校中所有学生的姓名
        List<String> names = school.getAllStudentNames();
        // 打印学生姓名
        for (String name : names) {
            System.out.println(name);
        }
    }
}

输出:

张三
李四
王五
相关文章
|
消息中间件
mq安装出现的问题 Unable to load crypto library. Failed with error:
mq安装出现的问题 Unable to load crypto library. Failed with error:
370 0
|
域名解析 .NET 开发框架
万网云解析设置二级域名解析到同IP不同端口
首先,进入云解析(注意,以下图片均做修改,仅做参考) 步骤阅读 2 先来使用端口的方式访问访问asp,ASP SUCCESS 正常。 3 继续,打开解析,进入如下页面,应该看到了一个叫做隐性URL,就是看这个。
9366 0
sa-token实现网关调用认证服务统一鉴权
sa-token实现网关调用认证服务统一鉴权
688 0
|
机器学习/深度学习 数据处理 对象存储
阿里云机器学习平台PAI智能标注Quick Start
智能标注(iTAG)是一款智能化数据标注平台,支持图像、文本、视频、音频等多种数据类型的标注以及多模态的混合标注。智能标注(iTAG)提供了丰富的标注内容组件和题目组件,您可以直接使用平台预置的标注模板,也可以根据自己的场景自定义模板进行数据标注。本文以图片标注为例演示该功能的使用。
5857 1
阿里云机器学习平台PAI智能标注Quick Start
|
缓存 安全 Java
如何利用Go语言提升微服务架构的性能
在当今的软件开发中,微服务架构逐渐成为主流选择,它通过将应用程序拆分为多个小服务来提升灵活性和可维护性。然而,如何确保这些微服务高效且稳定地运行是一个关键问题。Go语言,以其高效的并发处理能力和简洁的语法,成为解决这一问题的理想工具。本文将探讨如何通过Go语言优化微服务架构的性能,包括高效的并发编程、内存管理技巧以及如何利用Go生态系统中的工具来提升服务的响应速度和资源利用率。
|
12月前
|
算法 网络协议 安全
HTTP/2 协议的缺点是什么?
HTTP/2 协议的缺点是什么?
413 13
|
12月前
|
SQL NoSQL 关系型数据库
WK
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
474 1
|
文字识别 小程序 Java
视觉智能开放平台产品使用合集之如何在uniapp中调用图像识别api
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
195 0
下一篇
开通oss服务