【设计原则】迪米特法则


在这里插入图片描述

主页传送门:💁 传送

1.定义

       迪米特法则,英文名为Law of Demeter, toD,又称最少知道原则(Least Knowledge Principle,LKP)。

Only talk to your immediate friends.

       即:只与直接的朋友通信。什么叫做直接的朋友呢?每个对象都必然会与其它对象有耦合关系,两个对象之间的耦合就称为朋友关系,这种类型的关系有很多,例如组合,聚合,依赖等。

2.定义解读

       迪米特法则的核心思想是,一个对象应该尽可能地减少与其他对象之间的交互,而应该将其依赖关系限定在有限的几个接口上。这样,当其他对象发生改变时,对当前对象的影响也会最小化。
       迪米特法则的定义告诉我们,在设计软件系统时,应该尽量避免对象之间的紧耦合关系,减少不必要的通信。通过只与直接的朋友发生通信,可以降低对象之间的依赖关系,提高系统的可维护性和可重用性。

3.优缺点

迪米特法则的优点包括:

  • 提高代码的可维护性和可重用性:通过降低类之间的耦合,使得代码更加模块化,更容易进行维护和重用。
  • 提高系统的可扩展性和可维护性:通过减少不同模块之间的依赖,使得系统更容易进行扩展和维护。
  • 增强代码的可测试性:通过降低类之间的耦合,使得代码更容易进行单元测试和集成测试.

然而,迪米特法则也存在一些缺点:

  • 过度分解可能会导致代码过于复杂:如果过度使用迪米特法则,将导致系统中存在过多的类和接口,使得代码变得更加复杂和难以理解。
  • 可能会增加代码的复杂性:由于需要定义更多的接口和方法,这可能会导致代码的复杂性增加,使得开发人员需要花费更多的时间和精力来理解和维护代码。

4.案例分析

       我们来举一个很简单的例子,老板让人事主管统计全公司所有员工的生日。这个例子中总共有三个主要类:老板Boss、人事主管HrManager和员工Employee类图如下:

Boss
+command(HrManager hrManager)
HrManager
+countEmployeeBirthdays(List employeeList)
Employee
- name : string
- birthday : string
+getName()
+getBirthDay()

代码如下:
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
+command(HrManager hrManager)
HrManager
- employeeList : List
+countEmployeeBirthdays()
Employee
- name : string
- birthday : string
+getName()
+getBirthDay()

代码如下:
修改后的老板类(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.个人总结

       迪米特法则是一种重要的设计原则,它通过减少对象之间的交互,降低对象之间的依赖关系,提高了软件系统的可维护性和可重用性。在实际开发中,我们可以根据迪米特法则来设计模块之间的交互方式,从而降低系统的耦合度,提高开发效率和代码质量。然而,我们也需要注意迪米特法则的实际应用,并根据需求进行灵活处理,以求达到最佳的设计效果。

如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏 🙌一起讨论
你的支持就是我✍️创作的动力! 💞💞💞

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农桶子哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值