设计模式_05_迪米特法则
例:总公司打印员工信息
package designPatternOf_05; import java.util.ArrayList; import java.util.List; /** * 迪米特法则:一个对象,应该对其他对象保持最少了解 * 即:只与直接朋友发生通信 * 例子:一个集团,下属单位有分公司,和直属部门,现在要求打印所有下属单位的员工ID。 * 问题:公司与分公司耦合,与分公司员工没有直接关系,不因有耦合 */ public class LawOfDemeter_01 { public static void main(String[] args) { CompanyManager cm=new CompanyManager(); SubCompanyManager scm=new SubCompanyManager(); cm.printAllEmployee(scm); } } //公司员工 class Employee{ private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } //分公司员工 class SubEmployee{ private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } class SubCompanyManager{ public List getAllEmployee(){ List list=new ArrayList(); for(int i=0;i<100;i++){ SubEmployee semp=new SubEmployee(); //为分公司人员分配id semp.setId("分公司:"+i); list.add(semp); } return list; } } class CompanyManager{ public List getAllEmployee(){ List list=new ArrayList(); for(int i=0;i<100;i++){ Employee emp=new Employee(); //为分公司人员分配id emp.setId("公司:"+i); list.add(emp); } return list; } public void printAllEmployee(SubCompanyManager scm){ List<SubEmployee> list1=scm.getAllEmployee(); for (SubEmployee se : list1) { System.out.println(se.getId()); } List<Employee> list2=this.getAllEmployee(); for (Employee employee : list2) { System.out.println(employee.getId()); } } }
解决:
package designPatternOf_05; import java.util.ArrayList; import java.util.List; /** * 迪米特法则:一个对象,应该对其他对象保持最少了解 * 即:只与直接朋友发生通信 * 例子:一个集团,下属单位有分公司,和直属部门,现在要求打印所有下属单位的员工ID。 * 问题:公司与分公司耦合,与分公司员工没有直接关系,不因有耦合 * 修改:给分公司添加打印方法,这样总公司直接调用就行了 */ public class LawOfDemeter_02 { public static void main(String[] args) { CompanyManager02 cm=new CompanyManager02(); SubCompanyManager02 scm=new SubCompanyManager02(); } } //公司员工 class Employee02{ private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } //分公司员工 class SubEmployee02{ private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } } //分公司 class SubCompanyManager02{ public List getAllEmployee(){ List list=new ArrayList(); for(int i=0;i<100;i++){ SubEmployee semp=new SubEmployee(); //为分公司人员分配id semp.setId("分公司:"+i); list.add(semp); } return list; } //添加print方法 public void printEmployee(){ List<SubEmployee> se=this.getAllEmployee(); for (SubEmployee subEmployee : se) { System.out.println(subEmployee.getId()); } } } //总公司 开闭原则 class CompanyManager02{ public List getAllEmployee(){ List list=new ArrayList(); for(int i=0;i<100;i++){ Employee02 emp=new Employee02(); //为分公司人员分配id emp.setId("公司:"+i); list.add(emp); } return list; } public void printAllEmployee(SubCompanyManager02 scm){ scm.printEmployee(); List<Employee02> list2=this.getAllEmployee(); for (Employee02 employee : list2) { System.out.println(employee.getId()); } } }