设计模式_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());

        }

    }

}

 

你可能感兴趣的:(设计模式)