设计模式原则 - 迪米特法则(六)

news2025/1/22 12:19:42

迪米特法则

  • 一 官方定义
    • 基本介绍
  • 二 案例演示
    • 普通实现方式
      • 案例分析
    • 迪米特法则方式
  • 三 注意事项

一 官方定义

迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least KnowledgePrinciple, LKP)
One object should have a minimum understanding of other objects
(一个对象应该对其他对象有最少的了解 )
Only talk to your immediate friends ( 只与直接的朋友通信)

基本介绍

什么是一个对象应该对其他对象有最少的了解?

换句话说,对于被依赖的类,不管多么复杂都应该将逻辑封装在类的内部,对外只提供公共的public方法,不对外泄露任何其他的信息。

什么是只与直接的朋友通信?
朋友关系: 只要两个对象有依赖关系那他们两个就是朋友关系

直接的朋友:

  • 成员变量

也就是说一个类以成员变量的形式出现在另一个类内部的那么这两个类互为直接的朋友

  • 方法的参数类型

也就是说一个类的方法接收的参数类型是另一个类的类型那么这两个类互为直接的朋友

  • 方法的返回值类型

也就是说一个方法中接收的返回值类型是另一个类的类型那么这两个类互为直接的朋友

比如说在方法内部使用到的,比如说这个类以局部变量的形式出现的,这种情况下他们就不是直接的朋友关系。

二 案例演示

需求:有一个学校,下属有各个学院和总部,现要求打印出总部员工的ID和学院员工的ID

普通实现方式

SchoolEmployee 总部员工的基类

//总部员工的基类
public class SchoolEmployee {
    private String id;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
}

CollegeEmployee 学院员工的基类

//学院员工的基类
public class CollegeEmployee {

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

SchoolManager 总部管理类


import java.util.ArrayList;
import java.util.List;
//总部管理类
public class SchoolManager {

    //获取总部员工的方法
    public List<SchoolEmployee> getSchoolEmployee() {

        ArrayList<SchoolEmployee> schoolEmployees = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            SchoolEmployee schoolEmployee = new SchoolEmployee();
            schoolEmployee.setId("总部员工 ,id是" + i);
            schoolEmployees.add(schoolEmployee);
        }
        return schoolEmployees;
    }

    //打印方法

    public void printAllEmployee(CollegeManager collegeManager) {
        //打印总部的学院员工
        List<SchoolEmployee> schoolEmployee = this.getSchoolEmployee();
        for (SchoolEmployee employee : schoolEmployee) {
            System.out.println(employee.getId());
        }
        System.out.println("------------------");
        //打印学院员工的操作
        List<CollegeEmployee> collegeEmployee = collegeManager.getCollegeEmployee();
        for (CollegeEmployee employee : collegeEmployee) {
            System.out.println(employee.getId());
        }

    }
}

CollegeManager 学院的管理类


import java.util.ArrayList;
import java.util.List;

//学院的管理类
//提供一个获取学院员工的方法
public class CollegeManager {

    public List<CollegeEmployee> getCollegeEmployee(){

        ArrayList<CollegeEmployee> collegeEmployees = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            CollegeEmployee collegeEmployee = new CollegeEmployee();
            collegeEmployee.setId("学院员工,id是" + i);
            collegeEmployees.add(collegeEmployee);
        }

        return collegeEmployees;
    }

}

//案例演示 - 迪米特法则

//客户端的角色
//需求:有一个学校,下属有各个学院和总部,现要求打印出总部员工的ID和学院员工的ID
public class DemeterDemo {
    public static void main(String[] args) {
        new SchoolManager().printAllEmployee(new CollegeManager());
    }
}

在这里插入图片描述

案例分析

迪米特法则说道只与直接的朋友通信。
我们分析一下SchoolManager总部管理类。
在这里插入图片描述

迪米特法则方式

在这里插入图片描述
SchoolManager 总部管理类


public class SchoolManager {

    //获取总部员工的方法
    public List<SchoolEmployee> getSchoolEmployee(){

        ArrayList<SchoolEmployee> schoolEmployees = new ArrayList<>();

        for (int i = 0; i < 5; i++) {

            SchoolEmployee schoolEmployee = new SchoolEmployee();
            schoolEmployee.setId("总部员工 ,id是" + i);

            schoolEmployees.add(schoolEmployee);
        }

        return schoolEmployees;
    }

    //打印方法
    public void printAllEmployee(CollegeManager collegeManager){

        //打印总部的学院员工
        List<SchoolEmployee> schoolEmployee = this.getSchoolEmployee();
        for (SchoolEmployee employee : schoolEmployee) {
            System.out.println(employee.getId());
        }
        System.out.println("------------------");
        //打印学院员工的操作
        collegeManager.printCollegeEmployee();

    }
}

CollegeManager 学院的管理类

//学院的管理类
//提供一个获取学院员工的方法
public class CollegeManager {

    public List<CollegeEmployee> getCollegeEmployee(){

        ArrayList<CollegeEmployee> collegeEmployees = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            CollegeEmployee collegeEmployee = new CollegeEmployee();
            collegeEmployee.setId("学院员工,id是" + i);
            collegeEmployees.add(collegeEmployee);
        }

        return collegeEmployees;
    }

    //打印学院员工的方法
    public void printCollegeEmployee(){
        List<CollegeEmployee> collegeEmployee = getCollegeEmployee();
        for (CollegeEmployee employee : collegeEmployee) {
            System.out.println(employee.getId());
        }
    }
}

三 注意事项

  • 迪米特法则的核心是降低类之间的耦合
  • 从被依赖者的角度来说,尽量将逻辑封装在类的内部,对外除了提供的public方法,不泄露任何信息
  • 从依赖者的角度来说,只依赖应该依赖的对象
  • 切忌不要为了用而用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105600.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习100天(十五):015 逻辑回归基本原理

机器学习100天,今天讲的是:逻辑回归基本原理 一、线性回归与逻辑回归 我们之前介绍过线性回归,我们知道线性回归用于数值预测,例如房屋价格预测、信用卡额度预测等。线性回归最重要的一点就是它的预测值,即因变量一定是连续值,比如说房价。 而逻辑回归,它不是线性预测…

python数学建模--灰色预测

目录灰色预测一阶灰色方程GM(1,1)建模步骤应用及其求解步骤求级比一次累加序列求参数矩阵uuu时间响应式求预测序列模型检验实际值与预测值比较及可视化二阶灰色方程GM(2,1)灰色预测 灰色预测模型是通过少量的、不完全的信息&#xff0c;建立数学模型做出预测的预测方法&#x…

一篇文章彻底明白重要概念——注解

1. 注解基本概念 注解&#xff0c;什么是注解&#xff1f; 打开百度搜索 好&#xff0c;看不懂 没关系 一步一步慢慢来 先不管注解&#xff0c;注释这个概念应该就很熟悉了&#xff0c;文档注释&#xff0c;单行注释&#xff0c;多行注释 注释是对一段程序&#xff0c;一…

实战三十七:基于HMM模型实现中文分词

任务描述:在理解中文文本的语义时需要进行分词处理,分词算法包括字符串匹配算法,基于统计的机器学习算法两大类。本案例在前文将说明常用分词库及其简单应用,之后会通过中文分词的例子介绍和实现一个基于统计的中文分词方法——HMM模型,该模型能很好地处理歧义和未登录词问…

阿里工作8年熬到P8,经验全在这份864页文档里了,已助朋友进腾讯!

在阿里工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到P7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.5 QuickExtrude

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection UG/NX二次开发Siemens官方NXOPEN实例解析—2.3 Selection_UIStyler UG/NX二次开发Siemens官方NXOPEN实例解析—2.4 File2Points UG/NX二次…

Linux学习-96-win和vmware的linux系统之间文件传递

19.5 win和vmware的linux系统之间文件传递 Linux虚拟机与Window主机之间进行文件传输&#xff1a;需要在虚拟机安装VMware Tools才能实现Linux虚拟机和Windows主机之间文件传输。 Linux虚拟机与宿主机之间传输文件&#xff0c;可以通过以下几种方式&#xff1a; 方法1&#xf…

研究和文献参考丨艾美捷游离脂肪酸荧光法测定试剂盒

FFA的测量可用于确定代谢状态。艾美捷游离脂肪酸&#xff08;FFA&#xff09;荧光测定法为测量血浆、血清和尿液中游离脂肪酸提供了一种简单、可重复和灵敏的工具。FFA荧光测定法利用偶联酶反应产生高荧光产物间苯2酚。 艾美捷游离脂肪酸荧光法测定试剂盒基本参数&#xff1a; …

让chatGPT回答一些有趣?无聊的问题

本来我是没有国外的手机号的&#xff0c;也就没法注册chatGPT并使用。 不过好在 csdn 的猿如意 里面有体验功能&#xff0c;我就顺便体验一下。 这一次主要是看看chatGPT能否理解我的目的&#xff0c;很可惜&#xff0c;这一次并没有。 其实第一次 chatGPT准确的回答出了 自述…

windows11下安装Scoop和lux(annie)

windows11下安装Scoop和lux(annie) 文章目录windows11下安装Scoop和lux(annie)参考链接一、安装前环境确认1.PowerShell版本要求2.NET框架版本二、安装Scoop1. 安装scoop1.1 用默认安装路径的方式安装1.2 用指定安装路径的方式安装2. 验证是否安装成功3. 卸载scoop三、安装 lux…

NVIDIA-TAO环境配置及预训练模型使用样例-车牌号识别(Docker容器方法)

TAO是英伟达推出的可以简化企业AI应用和部署的模型自适应平台&#xff0c;其提供了大量的预训练模型以及模型finetune程序&#xff0c;使得用户可以快速的在自己的数据上进行模型finetune&#xff0c;之后用TAO的部署工具可以快速完成模型的部署。 TAO提供了四种使用方式&…

【LeetCode】118. 杨辉三角

【LeetCode】118. 杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 数学方式 双重循环&#…

UDP-TCP

文章目录再谈端口号协议号&#xff1a;端口号范围划分pidof(),命令行输入&#xff0c;根据进程名直接拿到进程idnetstat -nltp :查看网络状态UDP协议如何做到向上交互&#xff1f;&#xff08;分用问题&#xff09;如何做到封装和解包&#xff1f;Linux内核当中&#xff0c;如何…

【学习笔记】JDK源码学习之LinkedHashMap(附带面试题)

【学习笔记】JDK源码学习之LinkedHashMap&#xff08;附带面试题&#xff09; 其他好文&#xff1a; 地址 什么是 LinkedHashMap ? 它的作用又是什么&#xff1f;它和 HashMap 有什么区别呢&#xff1f; 老样子&#xff0c;带着以上问题来深入了解 LinkedHashMap 的作用吧。…

音频文件格式有哪些?误删音频文件如何恢复?

音频用于在计算机系统上以数字格式存储的音频数据。日常生活中&#xff0c;我们也会通过录音来保存一些重要的内容&#xff0c;或者是记录一些重要的事情。但是&#xff0c;你知道音频文件有哪几种格式吗&#xff1f;如果音频在保存的过程中&#xff0c;因为我们的误操作&#…

72. 如何给 SAP ABAP ALV 报表的修改功能添加自定义校验逻辑

本教程前面的步骤,我们已经介绍了如何编辑 SAP ALV 报表里的某一列数据: 70. 利用 ALV 实现增删改查系列之二:仅让 ALV 报表某一列允许被编辑如下图 Airfare 和 Capacity 列所示。然而实际的开发项目中,我们肯定不会允许用户对这些列进行随心所欲的修改,必定要增添一些自定…

力扣(202.454)补9.18

202.快乐数 不会。又要用到数学的思想&#xff0c;你要学会去分析。&#x1f641; 根据上表你需要知道&#xff0c;一个很大的数&#xff0c;经过快乐运算&#xff0c;不可能会一直增大&#xff0c;一定会受到限制。 class Solution { private int getNext(int n) { …

知识点21--springboot 文件上传

前面有一篇简单版的文件上传&#xff0c;是为了让大家知道文件上传是在干什么&#xff0c;但是在正式的开发中文件上传是一个稍微有些麻烦的东西&#xff0c;需要从页面层开发到数据层&#xff0c;如果你常常听人说文件上传会知道有一些相关的名词&#xff0c;比如切片、秒传、…

编程算法集锦

编程算法集锦一、分治法1.分治法介绍2.归并排序3.快速排序4.中值问题二、贪心法1.贪心法2.最小生成树Kruskal算法3.Huffman编码4.单源点最短路径三、回溯法1.回溯法-n皇后问题2.子集和数四、动态规划1.数塔问题2.最长公共子序列3.求序列-2 11 -4 13 -5 -2的最大字段和4.求最长的…

Linux内核工作队列(workqueue)详解

1、为什么需要工作队列&#xff1f; 在内核代码中&#xff0c;经常会遇到不能或不合适去马上调用某个处理过程&#xff0c;此时希望将该工作推送给某个内核线程执行&#xff0c;这样做的原因有很多&#xff0c;比如&#xff1a; 中断触发了某个过程的执行条件&#xff0c;而该过…