Java设计模式:一、六大设计原则-04:迪米特法则
文章目录
- 一、定义:迪米特法则
- 二、模拟场景:迪米特法则原则
- 三、违背方案:迪米特法则原则
- 3.1 工程结构
- 3.2 学生、老师、校长类
- 3.2.1 学生类
- 3.2.2 老师类
- 3.2.3 校长类
- 3.3 单元测试
- 四、改善代码:迪米特法则原则
- 4.1 工程结构
- 4.2 学生、老师、校长类
- 4.2.1 学生类
- 4.2.2 老师类
- 4.2.3 校长类
- 4.3 单元测试
一、定义:迪米特法则
- 迪米特法则(最少知道原则):
Least Knowledge Principle,LKP
。- 是指一个对象类对于其他对象类来说,知道的越少越好。
- 也就是说,两个类之间不要有过多的耦合关系,保持最少关联性。
- 迪米特法则有一句经典语录:只和朋友通信,不和陌生人说话。也就是说,有内在关联的类要内聚,没有直接关系的类要低耦合。
二、模拟场景:迪米特法则原则
- 模拟学生、老师、校长之间关系的例子来说明迪米特法则。
- 老师需要负责具体某一个学生的学习情况,而校长会关心老师所在班级的总体成绩,不会过问具体某一个学生的学习情况。
- 如果校长想知道一个班级的总分和平均分,是应该找老师要,还是跟每一个学生要再进行统计呢?
- 显然是应该找具体的班主任老师。
三、违背方案:迪米特法则原则
3.1 工程结构
design-1.4-0
|——src|——main|--java|--com.lino.design|--Principal.java|--Student.java|--Teacher.java|——test|--java|--com.lino.design.test|--ApiTest.java
3.2 学生、老师、校长类
3.2.1 学生类
Student.java
package com.lino.design;/*** @description: 学生*/
public class Student {/*** 姓名*/private String name;/*** 考试排名*/private int rank;/*** 考试分数*/private double grade;public Student() {}public Student(String name, int rank, double grade) {this.name = name;this.rank = rank;this.grade = grade;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}public double getGrade() {return grade;}public void setGrade(double grade) {this.grade = grade;}
}
- 定义一个学生信息类,包括学生姓名、考试排名、总分。
3.2.2 老师类
Teacher.java
package com.lino.design;import java.util.ArrayList;
import java.util.List;/*** @description: 老师*/
public class Teacher {/*** 老师名称*/private String name;/*** 班级*/private String clazz;/*** 学生列表*/private static List<Student> studentList;public Teacher() {}public Teacher(String name, String clazz) {this.name = name;this.clazz = clazz;}static {studentList = new ArrayList<>();studentList.add(new Student("花花", 10, 589));studentList.add(new Student("豆豆", 54, 356));studentList.add(new Student("秋雅", 23, 439));studentList.add(new Student("皮皮", 2, 665));studentList.add(new Student("蛋蛋", 19, 502));}public static List<Student> getStudentList() {return studentList;}public String getName() {return name;}public String getClazz() {return clazz;}
}
- 定义老师类,在老师类里初始化学生的信息,以及提供基本的信息获取接口。
3.2.3 校长类
Principal.java
package com.lino.design;import java.util.HashMap;
import java.util.Map;/*** @description: 校长*/
public class Principal {private Teacher teacher = new Teacher("丽华", "3年1班");public Map<String, Object> queryClazzInfo(String clazzId) {// 获取班级信息,学生总人数、总分、平均分int stuCount = clazzStudentCount();double totalScore = clazzTotalScore();double averageScore = clazzAverageScore();// 组装对象,实际业务开发会有对应的类Map<String, Object> mapObj = new HashMap<>(16);mapObj.put("班级", teacher.getClazz());mapObj.put("老师", teacher.getName());mapObj.put("学生人数", stuCount);mapObj.put("班级总分数", totalScore);mapObj.put("班级平均分", averageScore);return mapObj;}/*** 平均分*/private double clazzAverageScore() {double totalScore = 0;for (Student stu : Teacher.getStudentList()) {totalScore += stu.getGrade();}return totalScore / Teacher.getStudentList().size();}/*** 总分*/private double clazzTotalScore() {double totalScore = 0;for (Student stu : Teacher.getStudentList()) {totalScore += stu.getGrade();}return totalScore;}/*** 总人数*/private int clazzStudentCount() {return Teacher.getStudentList().size();}}
- 定义校长类,校长管理全局,并在校长类中获取学生人数、总分、平均分等。
3.3 单元测试
ApiTest.java
@Test
public void test_Principal() {Principal principal = new Principal();Map<String, Object> map = principal.queryClazzInfo("3年1班");logger.info("查询结果:{}", JSON.toJSONString(map));
}
测试结果
13:49:37.477 [main] INFO com.lino.design.test.ApiTest - 查询结果:{"学生人数":5,"班级平均分":510.2,"班级":"3年1班","老师":"丽华","班级总分数":2551.0}
- 以上就是通过校长管理所有学生,老师只提供了非常简单的信息。虽然可以查询到结果,但是违背了迪米特法则,因为校长需要了解每个学生的情况。
- 如果所有班级都让校长类统计,代码就会变得非常臃肿,也不易于维护和扩展。
四、改善代码:迪米特法则原则
4.1 工程结构
design-1.4-1
|——src|——main|--java|--com.lino.design|--Principal.java|--Student.java|--Teacher.java|——test|--java|--com.lino.design.test|--ApiTest.java
4.2 学生、老师、校长类
- 从以上的实现方式发现,不该让校长直接管理学生,校长应该管理老师,由老师提供相应的学生信息查询服务。
- 那么,接下来就是把校长要的信息交给老师类去处理。
4.2.1 学生类
Student.java
package com.lino.design;/*** @description: 学生*/
public class Student {/*** 姓名*/private String name;/*** 考试排名*/private int rank;/*** 考试分数*/private double grade;public Student() {}public Student(String name, int rank, double grade) {this.name = name;this.rank = rank;this.grade = grade;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getRank() {return rank;}public void setRank(int rank) {this.rank = rank;}public double getGrade() {return grade;}public void setGrade(double grade) {this.grade = grade;}
}
- 定义一个学生信息类,包括学生姓名、考试排名、总分。
4.2.2 老师类
Teacher.java
package com.lino.design;import java.util.ArrayList;
import java.util.List;/*** @description: 老师*/
public class Teacher {/*** 老师名称*/private String name;/*** 班级*/private String clazz;/*** 学生列表*/private static List<Student> studentList;public Teacher() {}public Teacher(String name, String clazz) {this.name = name;this.clazz = clazz;}static {studentList = new ArrayList<>();studentList.add(new Student("花花", 10, 589));studentList.add(new Student("豆豆", 54, 356));studentList.add(new Student("秋雅", 23, 439));studentList.add(new Student("皮皮", 2, 665));studentList.add(new Student("蛋蛋", 19, 502));}/*** 平均分*/public double clazzAverageScore() {double totalScore = 0;for (Student stu : studentList) {totalScore += stu.getGrade();}return totalScore / studentList.size();}/*** 总分*/public double clazzTotalScore() {double totalScore = 0;for (Student stu : studentList) {totalScore += stu.getGrade();}return totalScore;}/*** 总人数*/public int clazzStudentCount() {return studentList.size();}public static List<Student> getStudentList() {return studentList;}public String getName() {return name;}public String getClazz() {return clazz;}
}
- 在使用迪米特法则后,把原来违背迪米特法则的服务接口交给老师类处理。
- 这样每一位老师都会提供相应的功能,校长类只需要调用使用即可,而不需要了解每一位学生的分数。
4.2.3 校长类
Principal.java
package com.lino.design;import java.util.HashMap;
import java.util.Map;/*** @description: 校长*/
public class Principal {private Teacher teacher = new Teacher("丽华", "3年1班");public Map<String, Object> queryClazzInfo(String clazzId) {// 获取班级信息,学生总人数、总分、平均分int stuCount = teacher.clazzStudentCount();double totalScore = teacher.clazzTotalScore();double averageScore = teacher.clazzAverageScore();// 组装对象,实际业务开发会有对应的类Map<String, Object> mapObj = new HashMap<>(16);mapObj.put("班级", teacher.getClazz());mapObj.put("老师", teacher.getName());mapObj.put("学生人数", stuCount);mapObj.put("班级总分数", totalScore);mapObj.put("班级平均分", averageScore);return mapObj;}
}
- 校长类直接调用老师类的接口,并获取相应的信息。
4.3 单元测试
ApiTest.java
@Test
public void test_Principal() {Principal principal = new Principal();Map<String, Object> map = principal.queryClazzInfo("3年1班");logger.info("查询结果:{}", JSON.toJSONString(map));
}
测试结果
13:49:37.477 [main] INFO com.lino.design.test.ApiTest - 查询结果:{"学生人数":5,"班级平均分":510.2,"班级":"3年1班","老师":"丽华","班级总分数":2551.0}
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Java设计模式:一、六大设计原则-04:迪米特法则
文章目录 一、定义:迪米特法则二、模拟场景:迪米特法则原则三、违背方案:迪米特法则原则3.1 工程结构3.2 学生、老师、校长类3.2.1 学生类3.2.2 老师类3.2.3 校长类 3.3 单元测试 四、改善代码:迪米特法则原则4.1 工程结构4.2 学生…...
![](https://www.ngui.cc/images/no-images.jpg)
使用docker部署pg数据库
使用 Docker 部署 PostgreSQL 数据库是一种常见的做法,它提供了方便、可移植和可重复的方式来运行数据库。下面是一个简单的示例,用于在 Docker 中部署 PostgreSQL 数据库: 首先,确保您已经安装了 Docker 并正确配置了 Docker 环境…...
![](https://img-blog.csdnimg.cn/ed3e0c02dd004ec88cc0db5fc60019a2.png)
Json“牵手”亚马逊商品详情数据方法,亚马逊商品详情API接口,亚马逊API申请指南
亚马逊平台是美国最大的一家网络电子商务公司,亚马逊公司是1995年成立,刚开始只做网上书籍售卖业务,后来扩展到了其他产品。现在已经是全世界商品品种最多的网上零售商和第二互联网公司,亚马逊是北美洲、欧洲等地区的主流购物平台…...
![](https://img-blog.csdnimg.cn/7fbd73b070fa47e4960fd05226678c63.png)
springboot封装查询快递物流
目录 一、ApiClient代码解读二、ApiService代码解读三、HomeController代码解读四、整体代码五、结果展示 一、ApiClient代码解读 这是一个简单的Spring Boot的RestTemplate客户端,用于执行HTTP请求。 首先,这个类被Component注解标记,这意味…...
![](https://img-blog.csdnimg.cn/e3edf99de3d64446aa2bdfb94119d859.png)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
目录 1. 特殊类设计 1.1 不能被拷贝的类 1.2 只能在堆上创建的类 1.3 只能在栈上创建的类 1.4 不能被继承的类 1.5 只能创建一个对象的类(单例模式)(重点) 1.5.1 饿汉模式 1.5.2 懒汉模式 2. 类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 d…...
![](https://www.ngui.cc/images/no-images.jpg)
go 使用systray 实现托盘和程序退出
1.先 go get 安装 包 go get github.com/getlantern/systray2.使用的代码 func main() {fmt.Println("开始")systray.Run(onReady, onExit) }func onReady() {systray.SetIcon(icon.Data)systray.SetTitle("Awesome App")systray.SetTooltip("Prett…...
![](https://www.ngui.cc/images/no-images.jpg)
Electron之单例+多窗口
Electron之单例多窗口 Electron 24 React 18 单例可以通过app.requestSingleInstanceLock实现,多窗口可以简单通过路由来实现 单例 const gotTheLock app.requestSingleInstanceLock(); if (!gotTheLock) {app.quit(); } else {app.on(second-instance, (event, …...
![](https://www.ngui.cc/images/no-images.jpg)
A Survey of Knowledge-Enhanced Pre-trained Language Models
本文是LLM系列的文章,针对《A Survey of Knowledge-Enhanced Pre-trained Language Models》的翻译。 知识增强的预训练语言模型综述 摘要1 引言2 背景3 KE-PLMs用于NLU4 KE-PLMs用于NLG5 未来的方向5.1 整合来自同质和异质来源的知识5.2 探索多模态知识5.3 提供可…...
![](https://www.ngui.cc/images/no-images.jpg)
动态规划(选择)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 作为队伍的核心,forever97很受另外两个队友的尊敬。 Trote_w每天都要请forever97吃外卖,但很不幸的是宇宙中心forever97所在的学校周围只有3家forever97爱吃的外卖。 如果T…...
![](https://img-blog.csdnimg.cn/b99e588df04b498d9ab54032c4d5e931.png)
IIS WebDAV配置,https绑定及asp设置
IIS支持标准CGI,因此可以用程序语言针对STDIN和STDOUT开发。 IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例_Mongnewer的博客-CSDN博客 IIS支持脚本解释CGI,因此可以用脚本语言针对STDIN和STDOUT开发。 IIS perl python cbrother php脚本语言配置…...
![](https://img-blog.csdnimg.cn/img_convert/e93f089897e877a1528c3f31119e3dcb.png)
【计算机视觉项目实战】中文场景识别
✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。 👨&…...
![](https://www.ngui.cc/images/no-images.jpg)
Java 中 Map 初始化的几种方法
# 传统方式 Map<String, String> map new HashMap<>(); map.put("k1", "v1"); map.put("k2", "v2");# java8新特性-双括号初始化 Map<String, String> map1 new HashMap<>() {{put("k1", "v…...
![](https://www.ngui.cc/images/no-images.jpg)
【学习方法论】学习的三种境界、三种习惯、三个要点,三个心态
学习的三种境界、三种习惯、三个要点,三个心态 三种学习境界 苦学 古人云:“头悬梁、锥刺股”,勤学苦练是第一境界。处于这种层次的同学,觉得学习枯燥无味,对他们来说学习是一种被迫行为,体会不到学习中的…...
![](https://img-blog.csdnimg.cn/a40cb2123dd44bff8c2fafa39ee8a3bf.png)
[管理与领导-67]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 评估你与公司的八字是否相合
目录 前言: 一、概述 二、八字相合的步骤 2.1 企业文化是否相合 2.2.1 企业文化对职业选择的意义 2.2.2 个人与企业三观不合的结果 2.2.3 什么样的企业文化的公司不能加入 2.2 公司的发展前景 2.3 公司所处行业发展 2.4 创始人的三观 2.5 创始人与上司的…...
![](https://img-blog.csdnimg.cn/7a80245f0b5f4021a033b3789a9efdeb.png)
【PMO项目管理】深入了解项目管理 | Stakeholder 利益相关者 | 利益相关者之间的立场差异
💭 写在前面:本文将带您深入了解项目管理的核心概念和关键要素。我们将从项目管理的基本理解开始,逐步探讨其领域、复杂性和变化的重点,以及项目管理的具体过程。我们还将研究项目的性质以及成功项目所必备的条件。在此过程中&…...
![](https://img-blog.csdnimg.cn/img_convert/b8453ddd87ab13666e11c7748005d9e8.png)
设计模式-原则篇-01.开闭原则
简介 可以把设计模式理解为一套比较成熟并且成体系的建筑图纸,经过多次编码检验目前看来使用效果还不错的软件设计方案。适用的场景也比较广泛,在使用具体的设计模式之前先要学习软件设计的基础 “软件设计原则”,后面的23个设计模式都是…...
![](https://img-blog.csdnimg.cn/1421318507a249b1a03fdc070e5729bb.png#pic_center)
JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)
基于JavaSpringbootVue的在线教育系统(源码数据库18000字论文)096 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(管理员角色权限可自行分配) 用户功能: 注册、登录、课程预告、在线课程观看、学习资料下载、学习文章预览、个人信息管理、消息…...
![](https://img-blog.csdnimg.cn/6ac02949f08e4440a6611c80061066ca.png)
windows环境搭建ELK
目录 资源下载(8.9.1) ES安装、注册、使用 Kibana安装、注册、使用 Logstash安装、注册、使用 Filebeat安装、使用(如果只有一个数据流,则不需要使用filebeat,直接上logstash即可) 资源下载࿰…...
![](https://img-blog.csdnimg.cn/81a3417cfff74872819aa04a6842e183.png)
langchain介绍之-Prompt
LangChain 是一个基于语言模型开发应用程序的框架。它使得应用程序具备以下特点:1.数据感知:将语言模型与其他数据源连接起来。2.代理性:允许语言模型与其环境进行交互 LangChain 的主要价值在于:组件:用于处理语言模型…...
![](https://img-blog.csdnimg.cn/5be42e25197c4c62b074eab00fe6b8d6.png)
汇编语言Nasmide编辑软件
用来编写汇编语言源程序,Windows 记事本并不是一个好工具。同时,在命令行编译源程序也令很多人迷糊。毕竟,很多年轻的朋友都是用着 Windows 成长起来的,他们缺少在 DOS和 UNIX 下工作的经历。 我一直想找一个自己中意的汇编语言编…...
![](https://img-blog.csdnimg.cn/img_convert/a4a7d822a816bea6e004d94190876b53.png)
用python开发一个炸金花小游戏
众所周知扑克牌可谓是居家旅行、桌面交友的必备道具, 今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏,先来看一下基本的游戏规则。 炸(诈)金花又叫三张牌,是在全国广泛流传的一种民间多人纸牌游戏…...
![](https://img-blog.csdnimg.cn/ff7805029277461898f3d879967edbc3.png)
Uniapp中使用uQRCode二维码跳转小程序页面
下载插件 uQRCode官网地址 引入插件 文件如下 //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode = {};(functio…...
![](https://img-blog.csdnimg.cn/9cff52f18e36493da36ea37037b17717.png)
解决husky在mac下不生效的问题
目录 一、问题 1.1 问题描述 二、解决 2.1 解决 一、问题 1.1 问题描述 本文主要解决的问题是,husky在windows上正常生肖,但放到mac下后不生效的问题! 为了确保团队中提交代码的一致性,因此使用了 husky 作为提交的检测工具…...
![](https://img-blog.csdnimg.cn/0964e1c9f8b54c658757719d080e374d.jpeg)
如何在自动化测试中使用MitmProxy获取数据返回?
背景介绍 当我们在接口或UI自动化项目中,常常会出现这种现象——明明是正常请求,却无法获取到想要的数据返回。 比如: 场景A:页面是动态数据,第一次进入页面获取到的数据,和下次进入页面获取到的数据完全…...
![](https://img-blog.csdnimg.cn/cf90f6e5fbad471e97e31e9cff873309.png)
达之云BI平台助力中国融通集团陕西军民服务社有限公司实现数字化运营
中国融通集团陕西军民服务社是一家大型综合类零售购物中心,公司目前管理系统运行了10年左右,面临系统新零售支持发展严重滞后,行业主流应用落地困难,如线上业务、到家业务、全渠道营销、电子发票、自助收银、扫码购、无感停车、未…...
![](https://img-blog.csdnimg.cn/e7a2a814b5ff46b58e9300fd5e3083aa.png)
Private market:借助ZK实现的任意计算的trustless交易
1. 引言 Private market,借助zk-SNARKs和以太坊来 隐私且trustlessly selling: 1)以太坊地址的私钥(ECDSA keypair)2)EdDSA签名3)Groth16 proof:借助递归性来匿名交易Groth16 proo…...
![](https://img-blog.csdnimg.cn/dd06dd9890fd4bcfaa683a0bbc6abfb1.png)
反序列化漏洞复现(typecho)
文章目录 执行phpinfogetshell 执行phpinfo 将下面这段代码复制到一个php文件,命名为typecho_1.0-14.10.10_unserialize_phpinfo.php,代码中定义的类名与typecho中的类相同,是它能识别的类: <?php class Typecho_Feed{const…...
![](https://img-blog.csdnimg.cn/f129776a66754ecf83ba054d08fdb63f.png)
QT设计一个小闹钟
设置一个闹钟,左侧窗口显示当前时间,右侧设置时间,以及控制闹钟的开关,下方显示闹钟响时的提示语。当按启动按钮时,设置时间与闹钟提示语均不可再改变。当点击停止时,关闭闹钟并重新启用设置时间与闹钟提示…...
![](https://img-blog.csdnimg.cn/f9119912d49747668383b0234a3782aa.gif)
MybatisPlus(3)
前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 一、查询投影🍭 查询投影是指在查询操作中,只选择…...
![](https://www.ngui.cc/images/no-images.jpg)
安全计算环境技术测评要求项
1.身份鉴别-在应用系统及各类型设备中确认操作者身份的过程(身份鉴别和数据保密) 1-2/2-3/3-4/4-4 a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换 b)应具有…...
手机购物网站设计/网络运营seo是什么
原文链接:http://blog.csdn.net/xizero00/article/details/50914471 一、Layer的作用简介 Layer实际上定义了Layer的基本操作,即初始化层、前向传播和反向传播。在前向传播中根据bottom blob得到top blob,反向传播则根据top反传到bottom。而且在前传的…...
![](/images/no-images.jpg)
外链的论坛网站/软件发布网
ubuntu 8.04 内核升级 dpkg -l 查看安装的文件 首先更新apt-get源 vim /etc/apt/sources.list deb http://old-releases.ubuntu.com/ubuntu/ hardy main restricted universe multiversedeb-src http://old-releases.ubuntu.com/ubuntu/ hardy main restricted universe mu…...
![](/images/no-images.jpg)
网页设计与制作个人总结/惠州自动seo
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼unsigned int __stdcall scan(PVOID pM){char ip[20];strcpy(ip, (char*)pM);MYSQL mysql;MYSQL_RES* result;//初始化mysql句柄mysql_init(&mysql);//连接mysql数据库if(!mysql_real_connect(&mysql,"localhost"…...
![](/images/no-images.jpg)
网站设置安全/百度霸屏推广一般多少钱
一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配 合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站 对系统架构、性能的要求都很简单,随着互联网业务的不断丰富&…...
![](/images/no-images.jpg)
什么网站可以做设计兼职/爆款引流推广软件
在实际应用中,经常遇到需要删除空目录的情况,手动一一删除效率太低。 通过Python标准库os可方便实现嵌套空目录的删除。 问题 假设现有test目录结构如下,需要删除test目录中的空目录。 test └─1│ 1.txt│└─2└─3解决方法要点 利用…...
![](/images/no-images.jpg)
做a短视频网站/淄博网站优化
//这么写才能被正确渲染 <textarea></textarea> //这样就会有空格 <textarea> </textarea> 不能换行,涨姿势转载于:https://www.cnblogs.com/liyinSakura/p/5755560.html...