在前几篇我分析了单一职责,开放封闭以及依赖倒转的设计法则。今天我将在这篇文章中复习一下迪米特法则。
重点内容迪米特法则:两个类不必彼此之间通信,那这两个类就不应该有直接作用关系,应该通过第三方来建立通信。
这样做是为了降低两个没有直接关联的类之间的耦合,增强类的可重用性和灵活性。以免再改动A类而导致关系不大的B类也跟着修改。但是在这种情况下,我们就需要一个第三方来帮我们为二者负责起通信的关系,一旦这种类关系过多势必会导致生成过多的中间类,重而增加程序的复杂度,有时也是得不偿失。所以在考量迪米特法则的时候要慎重。
举例子来说,对于新入职的员工小王,他需要去找资源管理部的小张领电脑。
/**
* @author Created by yanjy on 2017/11/7.
*/
public class MachineManager {
private String name;
public MachineManager(String name) {
this.name = name;
}
public void deliverComputer() {
System.out.println("here is your computer");
}
}
/**
* @author Created by yanjy on 2017/11/7.
*/
public class Employer {
private String name;
Employer(String name) {
this.name = name;
}
public void getComputer(MachineManager machineManager) {
System.out.println(name + "please give me the computer");
machineManager.deliverComputer();
}
public static void main(String[] args) {
Employer employer = new Employer("xiaowang");
MachineManager machineManager = new MachineManager("xiaozhang");
employer.getComputer(machineManager);
}
}
在这终情况下,一旦这个电脑管理员离职了,我们苦命的小王也得跟着进行信息更新。当电脑出现问题的时候还要重新找人。在这种情况下,小王对接的若是资产管理部门的话(部门相对稳定),就不会因为资产管理员的变动而产生变化,可做如下修改:
package model;
import java.util.ArrayList;
import java.util.List;
/**
* @author Created by yanjy on 2017/11/7.
*/
public class MachineDept {
List<MachineManager> machineManagers;
public void addMachineManager(MachineManager machineManager) {
if (machineManagers == null) {
machineManagers = new ArrayList<>();
}
machineManagers.add(machineManager);
}
public void delieveComputer() {
if(machineManagers == null || machineManagers.size() == 0)
System.out.println("mechinaManagers left all!");
else
machineManagers.get(0).deliverComputer();
}
}
package model;
/**
* @author Created by yanjy on 2017/11/7.
*/
public class Employer {
private String name;
Employer(String name) {
this.name = name;
}
public void getComputer(MachineDept machineDept) {
System.out.println(name + "please give me the computer");
machineDept.delieveComputer();
}
public static void main(String[] args) {
Employer employer = new Employer("xiaowang");
MachineManager machineManager = new MachineManager("xiaozhang");
MachineDept machineDept = new MachineDept();
machineDept.addMachineManager(machineManager);
employer.getComputer(machineDept);
}
}
这样就可以通过引入资产管理部门来间接辅助员工和资产管理员之间的通信关系,重而降低两者之间的耦合度,但是这样的三方的引入也需要谨慎的权衡,避免过多无谓的引入,而导致产生冗杂的逻辑关系。