今天的博客主题
设计原则和模式 --》设计原则之迪米特法则
迪米特原则 LoD (Law of Demeter )
迪米特法则又叫最少知道原则 LKP (Least Knowledge Principle)
就是尽量降低类与类之间的耦合。一个对象应该对其他对象保持最少知道原则。
迪米特原则主要强调只和朋友说话,不和陌生人说话。
一般出现在成员变量,方法的输入,输出参数中的类都可以称之为成员朋友类,出现在方法体内部的类不属于朋友类。
场景
领导想知道目前商城正在销售的手机类型,及每个手机类型的销售额。这时候他找到手机负责人,手机负责人需要去统计结果,然后将结果汇报给领导。
代码设计
手机业务类
public class PhoneBusiness {
public String sale(String phone, Double money){
return "手机:" + phone + " 销售额:" + money;
}
}
手机负责人类
public class TeamLeader {
public void reportPhone(List<PhoneBusiness> phoneBusinessList){
for (int i = 0; i < phoneBusinessList.size(); i++) {
System.out.println(phoneBusinessList.get(0).sale("huawei note " + i, 10325.55 + i));
}
}
}
领导类
public class Boss {
public void checkPhone(TeamLeader teamLeader) {
List<PhoneBusiness> phoneBusinessList = new ArrayList<PhoneBusiness>();
// boss 一一查看,领导实时去统计
for (int i = 0; i < 10; i++) {
phoneBusinessList.add(new PhoneBusiness());
}
teamLeader.reportPhone(phoneBusinessList);
}
}
测试
public class DemoLKP {
public static void main(String[] args) {
Boss boss = new Boss();
TeamLeader teamLeader = new TeamLeader();
boss.checkPhone(teamLeader);
}
}
输出
手机:huawei note 0 销售额:10325.55
手机:huawei note 1 销售额:10326.55
手机:huawei note 2 销售额:10327.55
手机:huawei note 3 销售额:10328.55
手机:huawei note 4 销售额:10329.55
手机:huawei note 5 销售额:10330.55
手机:huawei note 6 销售额:10331.55
手机:huawei note 7 销售额:10332.55
手机:huawei note 8 销售额:10333.55
手机:huawei note 9 销售额:10334.55
到这里基本上功能算是实现了,看上去也没什么问题。
那么根据迪米特法则的定律,Boss 想知道结果是不用和 PhoneBusiness 直接产生联系的,TeamLeader 是他们之间的桥梁。
Boss 和 PhoneBusiness 并不是朋友关系。通过类图看下
改造下代码
领导类
public class Boss {
public void checkPhone(TeamLeader teamLeader) {
teamLeader.reportPhone();
}
}
手机负责人类
public class TeamLeader {
public void reportPhone(){
List<PhoneBusiness> phoneBusinessList = new ArrayList<PhoneBusiness>();
for (int i = 0; i < 10; i++) {
System.out.println(phoneBusinessList.get(0).sale("huawei note " + i, 10325.55 + i));
}
}
}
别的地方都不用修改。在看下类图
Boss 和 PhoneBusiness 就没有任何交集了是吧。
遇到复杂的业务逻辑,随机应变才是王道...