设计模式_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){ Listlist1=scm.getAllEmployee(); for (SubEmployee se : list1) { System.out.println(se.getId()); } List 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(){ Listse=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 list2=this.getAllEmployee(); for (Employee02 employee : list2) { System.out.println(employee.getId()); } }}