当前位置:网站首页>05.迪米特原则(Law of Demeter LoD)
05.迪米特原则(Law of Demeter LoD)
2022-07-22 09:10:00 【一鸭一鸭唷】
1.定义
- 指一个对象应该对其他对象保持最少的了解,又 叫最少知道原则(Least Knowledge Principle,LKP),尽量降低类与类之间的耦合。
- 迪米特原则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入、输出参数中的类都可以称之为成员朋友类,而出现在方法体内部的类不属于朋友类。
2.案例
案例情景:现在来设计一个权限系统,Boss 需要查看目前发布到线上的课程数量。这时候,Boss 要找到 TeamLeader 去进行统计,TeamLeader 再把统计结果告诉 Boss。
2.1 初始代码
- Course
public class Course {
}
- TeamLeader
public class TeamLeader {
public void checkNumberOfCourse(List<Course> courseList){
System.out.println("目前已经发布的课程数量为:"+courseList.size());
}
}
- Boss
public class Boss {
public void commandCheckNumber(TeamLeader teamLeader){
// 模拟Boss一页一页往下翻页,TeamLeader实时统计
List<Course> courseList = new ArrayList<Course>();
for (int i = 0; i < 20; i++) {
courseList.add(new Course());
}
teamLeader.checkNumberOfCourse(courseList);
}
}
- LDLTest
public class LDLTest {
public static void main(String[] args) {
Boss boss = new Boss();
TeamLeader teamLeader = new TeamLeader();
boss.commandCheckNumber(teamLeader);
}
}
从上面代码功能已经都已经实现,代码看上去也没什么问题。但是根据迪米特原则,Boss 只想要结果,不需要跟 Course 产生直接的交流。而 TeamLeader 统计需要引用 Course 对象。Boss 和 Course 并不是朋友,从下面的类图就可以看出来
2.2 优化代码
- TeamLeader
public class TeamLeader {
public void checkNumberOfCourse(){
// 模拟Boss一页一页往下翻页,TeamLeader实时统计
List<Course> courseList = new ArrayList<Course>();
for (int i = 0; i < 20; i++) {
courseList.add(new Course());
}
System.out.println("目前已经发布的课程数量为:"+courseList.size());
}
}
- Boss
public class Boss {
public void commandCheckNumber(TeamLeader teamLeader){
teamLeader.checkNumberOfCourse();
}
}
再来类图,Course 和 Boss 已经没有关联了。
边栏推荐
- 构造函数
- 全局作用域和函数作用域
- 力扣解法汇总532-数组中的 k-diff 数对
- debug glance(by quqi99)
- Codeforces Round #805 (Div. 3)(8/8)
- set up ovn based sr-iov test env (by quqi99)
- Go 语言学习:Go 语言之旅——练习题及参考答案
- [10:00 public class]: cloud video conference system privatization practice
- Why does chrome video get stuck badly (by quqi99)
- [Nordic] nrf52810 OTA upgrade (II) – how to use DFU
猜你喜欢
【STM32】STM32 SDIO SD卡读写测试(四)-- SD_Test之Transfer Mode阶段
debug glance(by quqi99)
【TOOLS】TortoiseSVN如何设置比较工具为Beyond Compare 4
Is it really necessary to define VO, Bo, Po, do, dto?
double类型不能进行精确计算的问题
2. Raspberry pie system backup
Use of content model and content collection for dynamic data processing of applet CMS
Mail Informer
24 SaaS thoughts
Fabric. JS centered element
随机推荐
centos7.5下添加gd库然后mysql拓展库没了mysql拓展的配置也没问题,phpinfo中就是没有mysql拓展
TCP与UDP及三次握手,四次挥手
Codeforces Round #799 (Div. 4)(8/8)
力扣解法汇总1217-玩筹码
Go 语言学习:Go 语言之旅(三)
Interview experience of Android Internet manufacturers
juju debug hacks (by quqi99)
Android互联网大厂面试经验
Tiktok massive engine 1 creates an advertising plan
为什么chrome视频时卡得厉害(by quqi99)
数据湖简单记录
力扣解法汇总648-单词替换
总结20220209
Applet implementation list and details page
debug glance(by quqi99)
[SDIO] sd2.0 protocol analysis summary (II) -- SD card identification & data transmission process
Try kolla-ansible (by quqi99)
【FatFs】FAT32文件系统协议总结(理论+实践)
力扣解法汇总498-对角线遍历
Fabric. JS centered element