- 设计模式就该这样学:基于经典框架源码和真实业务场景
- 谭勇德(Tom)
- 453字
- 2021-04-01 07:37:55
3.5 迪米特法则
3.5.1 迪米特法则的定义
迪米特法则(Law of Demeter,LoD)又叫作最少知道原则(Least Knowledge Principle,LKP),指一个对象应该对其他对象保持最少的了解,尽量降低类与类之间的耦合。迪米特法则主要强调只和朋友交流,不和陌生人说话。出现在成员变量、方法的输入和输出参数中的类都可以被称为成员朋友类,而出现在方法体内部的类不属于朋友类。
3.5.2 使用迪米特法则解决实际问题
我们来设计一个权限系统,TeamLeader需要查看目前发布到线上的课程数量。这时候,TeamLeader要让Employee去进行统计,Employee再把统计结果告诉TeamLeader,来看代码。
Course类的代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_42.jpg?sign=1739427421-l6Sc9qWuFTHGITosRypfW9FFfFCqeUkl-0-bfbef8e86c8619d7b06edf12f49809b8)
Employee类的代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_43.jpg?sign=1739427421-dnIfBYkCk3NudC32mNdCqEfLVGQDg3jD-0-389faaf0dce898bb0dd2c1e5b1eaa3af)
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_44.jpg?sign=1739427421-X1bQqxKowQTXk3Wfvn1aelvPIZerzisa-0-8df5c9d36ccf8bc02ac2c48aa1a6f70f)
TeamLeader类的代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_45.jpg?sign=1739427421-SirpyGp4QVwKXww7twaylWBHumNBwYUv-0-509e3d287256dd295b6b26ab7e3e0920)
客户端测试代码如下,将Employee对象作为参数传送给TeamLeader对象。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_46.jpg?sign=1739427421-732EJjsdFSlHfglrNODuHxLs77cGJ1NI-0-49cb9a60d603ed6c3d2fa72a1a846089)
写到这里,其实功能都已经实现,代码看上去也没什么问题。根据迪米特法则,TeamLeader只想要结果,不需要跟Course产生直接交流。而Employee统计需要引用Course对象,TeamLeader和Course并不是朋友,从如下图所示的类图就可以看出来。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_47.jpg?sign=1739427421-pL9UD5Im0O5ZIK7zS05wNHZXKWrYJYLi-0-245768ad3cb6d18bf19b3a8ad1a6751f)
下面对代码进行改造。
Employee类的代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_48.jpg?sign=1739427421-8YOz6kTaYgMwV3YL9wYUVp1tjb9CTalV-0-e9d833376e8518bba5959b77fc415e93)
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_49.jpg?sign=1739427421-aUOjIuYBCpMHKOrwEULFwsRxJKvRX09t-0-0d5a4f875e290ee5ed49502a979e1205)
TeamLeader类的代码如下。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_50.jpg?sign=1739427421-cVqQrT0m1mywjuqgL9CV9rlSExEe8SqS-0-3b7cf48c2113aa8c854c488e843694dd)
再来看如下图所示的类图,Course和TeamLeader已经没有关联了。
![img](https://epubservercos.yuewen.com/A1F36C/17725769807799506/epubprivate/OEBPS/Images/txt004_51.jpg?sign=1739427421-SIsWuNqLZcccVmsdhP5WJTfKmtISdJvs-0-681a40aa56051bf284489c6be09bdfda)
学习软件设计原则,千万不能形成强迫症。当碰到业务复杂的场景时,需要随机应变。