GoF23-迪米特法则

2024-03-29 02:38
文章标签 法则 米特 gof23

本文主要是介绍GoF23-迪米特法则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

迪米特法则

基本介绍
1)一个对象应该对其他对象保持最少的了解2)类与类关系越密切,耦合度越大3)迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的Public方法,不对外泄露任何信息4)迪米特法则还有个更简单的定义:只与直接的朋友通信5)直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。
应用实例
1)有一个学校,下属有各个学院和总部,1现要求打印出学校总部员工ID和学院员工的id
2)编程实现以上功能
package com.tan.principle.demeter;import java.util.ArrayList;
import java.util.List;public class Demeter {public static void main(String[] args) {//创建SchoolManager对象SchoolManager schoolManager = new SchoolManager();//打印输出学院的员工id和学校总部的员工信息schoolManager.printAllEmployee(new CollegeManager());}
}/*
学校总部员工类*/
class Employee {private String id;public void setId(String id) {this.id = id;}public String getId() {return id;}
}/*
学院员工类*/
class CollegeEmployee {private String id;public void setId(String id) {this.id = id;}public String getId() {return id;}
}/*
学校总部员工管理类其直接朋友类有:
Employee
CollegeManagerCollegeEmployee不是直接朋友,而是一个陌生类,违背了迪米特法则*/
class SchoolManager {public List<Employee> getAllEmployee() {//返回学校总部的员工ArrayList<Employee> list = new ArrayList<>();//增加了五个员工到list集合中for (int i = 0; i < 5; i++) {Employee employee = new Employee();employee.setId("学校总部员工id= " + i);list.add(employee);}return list;}//打印输出学校总部和学院员工信息void printAllEmployee(CollegeManager sub){/*分析:1.此处的CollegeEmployee不是SchoolManager的直接朋友2.CollegeEmployee是以局部变量的方式出现在SchoolManager中3.违反了迪米特法则*///获取到学院员工List<CollegeEmployee> list1 = sub.getAllEmployee();System.out.println("学校分部员工:");for (CollegeEmployee employee : list1) {System.out.println(employee.getId());}System.out.println(" ============================ ");//获取到学校总部员工List<Employee> list2 = this.getAllEmployee();System.out.println("学校总部员工:");for (Employee employee : list2) {System.out.println(employee.getId());}}
}/*
学院员工管理类*/
class CollegeManager {public List<CollegeEmployee> getAllEmployee() {List<CollegeEmployee> list = new ArrayList<>();//增加了十个员工到list集合中for (int i = 0; i < 10; i++) {CollegeEmployee collegeEmployee = new CollegeEmployee();collegeEmployee.setId("学院员工id=" + i);list.add(collegeEmployee);}return list;}
}
代码改进(迪米特法则)
应用实例改进:1)前面设计的问题在于SchoolManager中,College Employee类并不是SchoolManager类的直接朋友2)按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合3)对代码按照迪米特法则进行改进
package com.tan.principle.demeter.improve;import java.util.ArrayList;
import java.util.List;public class Demeter {public static void main(String[] args) {System.out.println("使用迪米特法则进行改进");//创建SchoolManager对象SchoolManager schoolManager = new SchoolManager();//打印输出学院的员工id和学校总部的员工信息schoolManager.printAllEmployee(new CollegeManager());}
}/*
学校总部员工类*/
class Employee {private String id;public void setId(String id) {this.id = id;}public String getId() {return id;}
}/*
学院员工类*/
class CollegeEmployee {private String id;public void setId(String id) {this.id = id;}public String getId() {return id;}
}/*
学校总部员工管理类其直接朋友类有:
Employee
CollegeManagerCollegeEmployee不是直接朋友,而是一个陌生类,违背了迪米特法则*/
class SchoolManager {public List<Employee> getAllEmployee() {//返回学校总部的员工ArrayList<Employee> list = new ArrayList<>();//增加了五个员工到list集合中for (int i = 0; i < 5; i++) {Employee employee = new Employee();employee.setId("学校总部员工id= " + i);list.add(employee);}return list;}//打印输出学校总部和学院员工信息void printAllEmployee(CollegeManager sub){/*分析:将打印输出学院员工的方法,封装到CollegeManager中*/sub.printEmployee();System.out.println(" ============================ ");//获取到学校总部员工List<Employee> list2 = this.getAllEmployee();System.out.println("学校总部员工:");for (Employee employee : list2) {System.out.println(employee.getId());}}
}/*
学院员工管理类*/
class CollegeManager {public List<CollegeEmployee> getAllEmployee() {List<CollegeEmployee> list = new ArrayList<>();//增加了十个员工到list集合中for (int i = 0; i < 10; i++) {CollegeEmployee collegeEmployee = new CollegeEmployee();collegeEmployee.setId("学院员工id=" + i);list.add(collegeEmployee);}return list;}//输出学院员工的信息public void printEmployee(){//获取到学院员工List<CollegeEmployee> list1 = getAllEmployee();System.out.println("学校分部员工:");for (CollegeEmployee employee : list1) {System.out.println(employee.getId());}}
}
迪米特法则注意事项
迪米特法则注意事项:
1)迪米特法则的核心是降低类之间的耦合2)但是注意:由于每个类都降低了不必要的依赖,因此迪米特法则只是要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系

这篇关于GoF23-迪米特法则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857383

相关文章

设计模式之禅5:迪米特法则

https://www.cnblogs.com/zh7791/p/7922960.html 定义: 一个对象应该对其他对象保持最少的了解。 问题由来: 类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。 解决方案: 尽量降低类与类之间的耦合。   PS:   自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚。 无论是面向过程编程还

GameFi生存法则:从巨头争霸到小游戏革命,掀起区块链游戏的全新风暴

随着区块链技术的飞速发展,GameFi(游戏与去中心化金融的结合)正成为加密世界的一个重要领域。然而,随着时间的推移,这一领域也经历了显著的演变,从最初的3A大作到如今流行的Telegram小游戏,这种变化不仅反映了市场需求的转变,也揭示了GameFi如何在生存与繁荣之间找到平衡。 一、GameFi 的演变:从 3A 大作到 Telegram 小游戏 不同类型 GameFi 项目的优劣 Ga

阿姆达尔定律 是什么 Amdahl 并行效率计算经验法则

阿姆达尔定律(Amdahl) 是计算机界的一个经验法则。是以计算机科学家吉恩·阿姆达尔来命名的。 它表示串行执行的计算机程序在并行执行后效率的 提升。 它给 出了使用并行处理理论上能带来的效率提高。 考虑运行在单核处理器上的一个程序。在执行时间上来说,“f”是并行计算部分执行时间所占比 例,所以(1-f)是串行处理部分所占比例。 如果有“m”个处理器并行运行,那理论上的优化空 间计算如下

洛必达法则理解

f(x)/g(x) 当f(x) = g(x) = 0的时候 f(x) ~= df(x)dx g(x) ~= dg(x)dx f(x)/g(x) ~= df(x)/dg(x)

python 实现simpson rule辛普森法则算法

simpson rule辛普森法则算法介绍 辛普森法则(Simpson’s rule)是一种数值积分方法,用于估计函数在给定区间上的定积分。该方法利用二次函数来逼近被积函数,从而得到更准确的积分估计。 辛普森法则的算法通常将积分区间[a,b]划分成n个小区间(n为偶数),每个小区间的长度为h=(b−a)/n。然后,它使用三个点(区间开始、中间和结束)的函数值来近似每个小区间上的积分,并累加这些

英语钻石法则(二)------没必要专门的学习语法

钻石法则二:没必要专门的学习语法 前言:     如果你是海归学霸或者你现在就能很流利的讲一口漂亮、自信的英语了,你可以回想一下你自己第二语言积累的 历程,希望可以分享给更多的人;如果你想早日讲一口流利的英语,下文将会给你一些启迪:   在你阅读这篇文章之前,我想于一个问题开始:

导数的基本法则与常用导数公式的推导

目录 n 次幂函数导数公式的推导导数和的运算法则的证明正弦、余弦函数导数公式的推导代数证明两个重要极限(引理)及证明具体推导 几何直观 导数积的运算法则的证明导数商的法则的证明链式法则的证明有理幂函数求导法则的证明反函数求导法则的证明反正切函数导数公式的推导指数函数导数公式的推导引入证明第一种方法:代入消元第二种方法:对数微分 幂指函数导数公式的推导幂法则(The Power Rule)的

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

1 基本介绍 一个对象应该对其他对象保持最少的了解 类与类关系越密切,耦合度越大 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的 public 方法,不对外泄露任何信息 迪米特法则还有个更简单的定义:只与直接的朋友通信,其中“朋友”包括当前对象本身、