五、迪米特法则
1. 概念
迪米特法则又叫最少知识原则。
- 只和你直接朋友说话,不和陌生人讲话
什么意思?没理解,感觉很虚,那么我继续解释一下:
- 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。
- 这样做的好处就是降低类之间的耦合度,提高模块的相对独立性。
【举个例子】
假如现在我要买房,我去卖房软件上,看到了一个自己喜欢的房,打电话,接电话的人大多都是房产中介。
再比如,我们都是程序员,如果有一家公司想做一款app,他会去找软件工程师呢,还是软件开发公司,他一定回去找开发公司。我们开发工程师根本不需要知道甲方是谁,我们只负责开发即可,这就是软件实体之间无需直接通信。
迪米特法则中的 “ 朋友 ” 的概念:
- 当前对象本身(自己和自己肯定是朋友)
- 当前对象的成员对象
- 当前对象所创建的对象(再当前对象中创建了另一个对象)
- 当前对象的方法参数
存在关联,聚合,组合,依赖关系的都可以直接访问这些对象的方法,不需要中间商。
知识点拓展-关联关系
【知识点解谜】
依赖与聚合傻傻分不清楚:现在你可以简单的理解为一个是成员对象,一个是局部变量。
【案例-明星与经纪人】
明星由于全身心投入艺术,还需要唱跳打篮球,所以许多日常事务由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务治淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。
不使用迪米特法则的代码:
/**
* 粉丝类
*/
@Getter
@AllArgsConstructor
public class Fans {
private String name;
}
/**
* 媒体公司
*/
@Getter
@AllArgsConstructor
public class Company {
private String name;
}
/**
* 明星类
*/
@Getter
@AllArgsConstructor
public class Star {
private String name;
/**
* 和某个粉丝见面
*/
public void meeting(Fans fans) {
System.out.println("明星" + name + "和粉丝" + fans.getName() + "见面了!!!");
}
public void business(Company company) {
System.out.println("明星" + name + "和公司" + company.getName() + "洽谈工作!!!");
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Company company = new Company("企鹅公司");
Star star = new Star("蔡老师");
Fans fans = new Fans("小明");
star.meeting(fans);
star.business(company);
}
}
使用迪米特原则修改代码:
/**
* 明星类
*/
@Getter
@AllArgsConstructor
public class Star {
private String name;
}
/**
* 粉丝类
*/
@Getter
@AllArgsConstructor
public class Fans {
private String name;
}
/**
* 媒体公司
*/
@Getter
@AllArgsConstructor
public class Company {
private String name;
}
@Getter
@AllArgsConstructor
public class Agent {
private Star star;
private Fans fans;
private Company company;
/**
* 和某个粉丝见面
*/
public void meeting() {
System.out.println("明星" + star.getName() + "和粉丝" + fans.getName() + "见面了!!!");
}
public void business() {
System.out.println("明星" + star.getName() + "和公司" + company.getName() + "洽谈工作!!!");
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Agent agent = new Agent(new Star("苍井老师"), new Fans("李四"), new Company("某大型娱乐公司"));
agent.meeting();
agent.business();
}
}
使用迪米特原则设计后的Star就和Fans,Company解耦了,提高了扩展性。
记住:不要和陌生人说话,想说话,找我经纪人。