• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
第二天半
博客园    首页    新随笔    联系   管理    订阅  订阅

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

 

posted @ 2015-04-29 13:22  第二天半  阅读(162)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3