![在这里插入图片描述](https://img-blog.csdnimg.cn/84b816f990654d439e8c06f17a66b010.png#pic_center)
主页传送门:💁 传送
1.定义
迪米特法则,英文名为Law of Demeter, toD,又称最少知道原则(Least Knowledge Principle,LKP)。
Only talk to your immediate friends.
即:只与直接的朋友通信。什么叫做直接的朋友呢?每个对象都必然会与其它对象有耦合关系,两个对象之间的耦合就称为朋友关系,这种类型的关系有很多,例如组合,聚合,依赖等。
2.定义解读
迪米特法则的核心思想是,一个对象应该尽可能地减少与其他对象之间的交互,而应该将其依赖关系限定在有限的几个接口上。这样,当其他对象发生改变时,对当前对象的影响也会最小化。
迪米特法则的定义告诉我们,在设计软件系统时,应该尽量避免对象之间的紧耦合关系,减少不必要的通信。通过只与直接的朋友发生通信,可以降低对象之间的依赖关系,提高系统的可维护性和可重用性。
3.优缺点
迪米特法则的优点包括:
- 提高代码的可维护性和可重用性:通过降低类之间的耦合,使得代码更加模块化,更容易进行维护和重用。
- 提高系统的可扩展性和可维护性:通过减少不同模块之间的依赖,使得系统更容易进行扩展和维护。
- 增强代码的可测试性:通过降低类之间的耦合,使得代码更容易进行单元测试和集成测试.
然而,迪米特法则也存在一些缺点:
- 过度分解可能会导致代码过于复杂:如果过度使用迪米特法则,将导致系统中存在过多的类和接口,使得代码变得更加复杂和难以理解。
- 可能会增加代码的复杂性:由于需要定义更多的接口和方法,这可能会导致代码的复杂性增加,使得开发人员需要花费更多的时间和精力来理解和维护代码。
4.案例分析
我们来举一个很简单的例子,老板让人事主管统计全公司所有员工的生日。这个例子中总共有三个主要类:老板Boss、人事主管HrManager和员工Employee类图如下:
代码如下:
Boss类的command方法负责发送命令给人事主管,命令他统计所有员工生日。
老板类(Boss):
public class Boss {
public void command(HrManager hrManager){
List<Employee> employeeList = new ArrayList();
for(int i = 0; i < 100; i++) {
employeeList.add(new Employee("name"+ i, "birthday"+ i));
}
haManager.countEmployeeBirthdays(employeeList);
}
}
HrManager类的countEmployeeBirthdays方法负责统计所有员工生日。
人事主管(HrManager):
public class HrManager {
public void countEmployeeBirthdays(List<Employee> employeeList) {
for(Employee employee : employeeList) {
System.out.println(employee.getName() + "的生日是:" + employee.getBirthday());
}
}
}
Employee类有两个成员属性name和birthday
员工(Employee):
public class Employee {
private String name;
private String birthday;
public Employee(String name, String birthday) {
this.name = name;
this.birthday = birthday;
}
public String getName() {
return name;
}
public String getBirthday() {
return birthday;
}
}
人事主管按照老板的要求对全公司所有员工的生日进行统计,并得出了结果。我们回过头来思考在这个程序中有什么问题?我们的Boss有几个朋友?两个,一个是HrManager,因为它是Boss的command方法的输入参数;另一个是Employee,因为在Boss的command方法体中使用了Employee。那么我们的Boss有几个是直接的朋友?按照直接的朋友的定义“出现在成员变量、方法的输入输出参数中的类就是直接的朋友”,只有HrManager是Boss的直接的朋友。Boss在command方法中创建了Employee的数组,和非直接的朋友Employee发生了交流,所以,上述例子违反了迪米特法则。方法是类的一个行为,类竟然不知道自己的行为与其他的类产生了依赖关系,这是不允许的,严重违反了迪米特法则!
为了使上述例子符合迪米特法则,我们可以做如下修改:
类图如下:
代码如下:
修改后的老板类(Boss):
public class Boss {
public void command(HrManager hrManager){
hrManager.countEmployeeBirthdays(employeeList);
}
}
修改后的人事主管类(HrManager):
public class HrManager {
private List<Employee> employeeList;
public HrMnager(List<Employee> employeeList){
this.employeeList = employeeList
}
public void countEmployeeBirthdays() {
for(Employee employee : employeeList) {
System.out.println(employee.getName() + "的生日是:" + employee.getBirthday());
}
}
}
员工类不变(Employee):
public class Employee {
private String name;
private String birthday;
public Employee(String name, String birthday) {
this.name = name;
this.birthday = birthday;
}
public String getName() {
return name;
}
public String getBirthday() {
return birthday;
}
}
还需要一个场景类(Client) :
public class Client {
public void static main(String[] args) {
List<Employee> employeeList = new ArrayList();
for(int i = 0; i < 100; i++) {
employeeList.add(new Employee("name"+ i, "birthday"+ i));
}
Boss boss = new Boss();
boss.command(new HrManager(employeeList));
}
}
这样修改后,每个类都只和直接的朋友交流,有效减少了类之间的耦合,完全符合迪米特法则。
5.个人总结
迪米特法则是一种重要的设计原则,它通过减少对象之间的交互,降低对象之间的依赖关系,提高了软件系统的可维护性和可重用性。在实际开发中,我们可以根据迪米特法则来设计模块之间的交互方式,从而降低系统的耦合度,提高开发效率和代码质量。然而,我们也需要注意迪米特法则的实际应用,并根据需求进行灵活处理,以求达到最佳的设计效果。
如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论
你的支持就是我✍️创作的动力! 💞💞💞