时不待我 天道酬勤

没有多少时间可以虚度了....

导航

迪米特法则

Posted on 2012-03-05 11:54  jadesun  阅读(1106)  评论(0编辑  收藏  举报

迪米特法则(Law of Demeter,LoD)描述的是一个规则:一个对象应该对其它对象有最少的了解。迪米特法则的实际意义就是实现类内部的高内聚,类之间的低耦合。迪米特法则对类的低耦合提出明确的要求,其包含以下含义:

只和朋友类交流。

什么是直接的朋友类?每个对象都必然会与其他对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系的类型有很多,例如组合、聚合、依赖。朋友类的定义如下:出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。案例:

 

 定义一个教师类,从迪米特法则来看,Teacher类中,GroupLeader是属于朋友类,因为它们通过方法的输入输出参数来成为朋友类的。

public class Teacher{
  public void commond(GroupLeader groupLeader){
    List<Gril> listGirls = new ArrayList();
    for (int i=0; i<20; i++){
      listGirls.add(new Gril());
    }
    groupLeader.countGrils(listGirls);
  }
}

而Gril这个类是出现在commond方法体内,因此不属于Teacher类的朋友类,这样就破坏了Teacher的健壮性。因为方法是类的一个行为,类竟然不知道自己的行为与其它类产生依赖关系,这是违反迪米特法则的。造成了Teacher和Girl两个类之间的高耦合。

public class GroupLeader{
  public void countGrils(List<Gril> listGirls){
    System.out.println("女生数量是:"+listGirls.size()); 
  }
}

 


 

 


 

将以上的代码进行修改,以符合迪米特法则。首先将Girl类从Teacher类的commond方法移除。

public class Teacher {
    public void commond(GroupLeader groupLeader){
        groupLeader.countGirls();
    }
}

修改GroupLeader类,将Gril类做为成员变量。

public class GroupLeader{
    private List<Gril> listGirls;
    public GroupLeader(List<Girl> _listGirls){
        this.listGirls = _listGirls;
    }
    public void countGirls(){
        System.out.println()("女生数量是:"+this.listGirls.size())
    }
}

把List<Girl>的初始化移动到场景类中,同时在GroupLeader中增加对Gril的注入,避开Teacher类对陌生类Gril的访问,降低系统之间的耦合。

 

public class Client{
    public static void main(String[] args){
        //产生一个女生群体
        List<Girl> listGirls = new ArrayList<Girl>();
        //初始化Gril的值
        for (int i=0; i<20;i++){
            listGirls.add(new Girl());
        }
        Teacher teacher = new Teacher();
        
        teacher.commond(new GroupLeader(listGirls));
    }
}