设计模式_05_迪米特法则

设计模式_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());
        }
    }
}
原文地址:https://www.cnblogs.com/zjsy/p/4465698.html