迪米特法则(LOD)规定了:不应该和陌生人打交道
具体解释为:如果两个类直接无需直接通信,那就不应该发生直接的相互调用,可以通过第三方转发该调用。目的是为了降低类的耦合度,提升类之间的独立性
优点:
- 降低类之间的耦合,提升类之间的独立性
- 提高可复用性和扩展性
实现方法:
- 在创建类的时候,应该尽量创建弱耦合的类,耦合越弱,则其可复用性越高
- 类中的变量,其访问权限越低越好
- 不直接暴露变了,而应该提供set/get方法
- 谨慎使用序列化(Serializable)
反例:明星和粉丝直接见面,这违反了迪米特法则
public static void main(String[] args) {
Fan fan = new Fan();
fan.meeting(); // 刘亦菲与粉丝见面啦~
// 明星类直接出现在对应的方法中,违反了迪米特法则的不与陌生人打交道的原则
}
// 明星类
static class Start{
String name;
Start(String name){
this.name = name;
}
}
// 粉丝
static class Fan{
public void meeting(){
Start start = new Start("刘亦菲");
System.out.println(start.name+"与粉丝见面啦~");
}
}
正例:明星和粉丝不应该直接见面,应该通过经纪人去安排
public static void main(String[] args) {
// 创建明星和他对应的经纪人
Agent agent = new Agent(new Start("刘亦菲"));
// 创建粉丝~
Fan fan = new Fan();
fan.setName("张三");
// 由经纪人安排明星和粉丝见面
agent.meeting(fan); // 刘亦菲与张三粉丝见面啦~
}
// 明星类
static class Start{
String name;
Start(String name){
this.name = name;
}
}
// 经纪人
static class Agent{
Start start;
Agent(Start start){
this.start = start;
}
public void meeting(Fan fan){
System.out.println(start.name+"与"+fan.getName()+"粉丝见面啦~");
}
}
// 粉丝
static class Fan{
String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}