首页 > 其他 > 详细

迪米特法则

时间:2020-03-22 16:44:02      阅读:77      评论:0      收藏:0      [点我收藏+]

1.起源与定义

1.1起源

  迪米特法则最初是用来作为面向对象的系统设计风格的一种法则,是于1987年秋天由Ian Holland在美国东北大学(Northeastern University)为一个叫做迪米特(Demeter)的项目设计提出的。这条法则指导设计了许多著名的系统,如火星登录软件系统、木星的欧罗巴卫星轨道飞船软件系统等。

1.2定义

  只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。其中中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。 

2.实现

  在将迪米特法则运用到系统设计中时,要注意下面的几点:在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成 员函数的访问权限;在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。下面通过一个简单实例来加深对迪米特法则的理解:

  明星许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,适合使用迪米特法则。

 

技术分享图片

 

 

 

public class LoDtest
{
    public static void main(String[] args)
    {
        Agent agent=new Agent();
        agent.setStar(new Star("明星"));
        agent.setFans(new Fans("粉丝"));
        agent.setCompany(new Company("传媒公司"));
        agent.meeting();
        agent.business();
    }
}

class Agent
{
    private Star myStar;
    private Fans myFans;
    private Company myCompany;
    public void setStar(Star myStar)
    {
        this.myStar=myStar;
    }
    public void setFans(Fans myFans)
    {
        this.myFans=myFans;
    }
    public void setCompany(Company myCompany)
    {
        this.myCompany=myCompany;
    }
    public void meeting()
    {
        System.out.println(myFans.getName()+"与明星"+myStar.getName()+"见面了。");
    }
    public void business()
    {
        System.out.println(myCompany.getName()+"与明星"+myStar.getName()+"洽淡业务。");
    }
}

class Star
{
    private String name;
    Star(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
}

class Fans
{
    private String name;
    Fans(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
}

class Company
{
    private String name;
    Company(String name)
    {
        this.name=name;
    }
    public String getName()
    {
        return name;
    }
}

3.优点

  迪米特法则要求限制软件实体之间通信的宽度和深度,具有降低了类之间的耦合度,提高了模块的相对独立性的优点,并且由于亲合度降低,它可以提高类的可复用率和系统的扩展性。但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。 

 

参考链接:https://www.jianshu.com/p/4b244f132439

      https://www.cnblogs.com/zh7791/p/7922960.html

      http://c.biancheng.net/view/1331.html

 

迪米特法则

原文:https://www.cnblogs.com/kyl626/p/12546374.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!