惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
小众软件
小众软件
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
Last Week in AI
Last Week in AI
博客园_首页
I
InfoQ
T
Tailwind CSS Blog
爱范儿
爱范儿
雷峰网
雷峰网
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
B
Blog
WordPress大学
WordPress大学
A
About on SuperTechFans
V
Visual Studio Blog
有赞技术团队
有赞技术团队
P
Proofpoint News Feed

博客园 - jadesun

【转载】Zachman框架 参加了IBM的架构师培训,总结了一些内容 数据仓库 - 事实表和维度表建立的方法论 Hadoop的学习历程 Hadoop手册_v0.3 MySQL_Cluster 的尝试及各种测试 Hadoop的学习历程 Hadoop手册_v0.2 尝试数据分片处理 和同事扯了一个理论模型出来,后面再验证是否合理。 依赖倒置原则 中国航油项目的一次数据库优化,关于Audit Logout的问题。 公文流转SQL优化日志七 公文流转SQL优化日志六 和同事们终于将Entity FrameWork整合进新的框架中了,发布第一个版本。 继续上篇实现的架构,有了新的进展。介绍一下格瑞趋势的产品 公文流转SQL优化日志五 工作日志,正在实现中的架构,针对SQL SERVER。参考了DZ的设计 公文流转SQL优化日志四 公文流转SQL优化日志三 公文流转SQL优化日志二
迪米特法则
jadesun · 2012-03-05 · via 博客园 - jadesun

迪米特法则(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));
    }
}