迪米特法则

转载请注明出处!!!http://blog.csdn.net/zhonghuan1992

         所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern



跟着ZHONGHuan学习设计模式

迪米特法则









         迪米特法则(Law ofDemeter,LoD)又叫最小知识原则(least knowledge principle,lkp),定义为:一个对象对其它对象尽可能少的理解。

         通俗的说法有很多,比如,只与你直接的朋友们通信;不要跟“陌生人”说话;

         这样做的目的就是降低类之间的耦合。想想上课的时候,老师经常说高内聚,低耦合。为了更好的理解,我们说一些题外话。拿笔记本电脑举例子,记得小时候,我拆笔记本电脑,内部的部件之间不像现在笔记本一样。部件之间的连线会比较多一点,不像现在的笔记本,说拆很快就能拆下来。这是为什么呢?因为现在的笔记本比我小时候的笔记本,在内部构件上,更具备独立性,一个部件高度内聚部件自己的功能职责,对外提供一个简单的接口。。我想如果不这样做,那么当我们要拆一个笔记本的时候,会很麻烦,内部数据线缠绕,你可以想象一下那样的场景,即使是一个熟练的技术工人,也未必能够很快的拆完笔记本。但是高度内聚之后,我们很方便就能够拆下来。并且,这样做的好处不仅仅是这样,当笔记本坏掉之后,我们也能够更快的测试时那一部分坏掉,然后将该部分拆下,装上新的部件能够马上使用。这些是高内聚,低耦合的好处。

         硬件如此,软件也是一样的,具有雷同之处,有很多原因让我们保证产品内部高内聚,低耦合。

         而遵从迪米特法则能够让我们的设计降低类之间的耦合。为了更好的理解,我们从一个例子讲起。

         大部分的人都应该看过“教父“三部曲,(没看过的也没有关系),教父名字上和教会有关系,的确,电影中的教父信仰基督教,但是他并不是基督教的什么职务。教父其实就是黑社会老大给自己取得一个不错的代名词而已,因为这个黑社会老大比一般的黑社会老大高上几个档次。现在教父想要杀人了,(因为某人挨着他的路了)。看下面一段没有满足迪米特法则的设计与代码。

        迪米特法则_第1张图片

代码:

 

class Person{
         public String name;
}
class GodFather{
         CoreMember coremember;
         public void kill(Person someone)
         {
                   Killer killer = new Killer();
                   killer.kill(someone);
         }
}
 
class CoreMember{
         private Killer killer;
}
 
class Killer{
         public void kill(Person someone)
         {
                   System.out.println(someone.name+"被杀死了");
         }
}

         从上面的UML类图中,我们可以看到,教父和一个杀手存在联系。我们可以想想,这不现实对吧。教父是美国一个超级黑社会大佬,一般杀手不屑于见,并且教父一般只和自己信任的人交往,所以和杀手打交道的事一般交给下面的人干。(不过,电影里面的教父可能比较亲民,不懂忽略这个),杀手对于教父应该是不可见的。我们重新设计一下。

迪米特法则_第2张图片


代码:

class Person{
    public String name;
}
class GodFather{
    CoreMember coremember;
    public void kill(Person someone)
    {
              coremember.kill(someone);
    }
}

class CoreMember{
    private Killer killer;
    public void kill(Person someone)
    {
              killer.kill(someone);
    }
}

class Killer{
    public void kill(Person someone)
    {
              System.out.println(someone.name+"被杀死了");
    }
}

         上述设计显然会更符合实际情况,并且这样做也是符合迪米特法则的,对于教父来说,killer是教父的陌生人(关于朋友与陌生人,请看后面),所以教父不应当和killer产生耦合关系,而应当是由他的手下去和杀手交接。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的一个方法的话,可以通过第三者转发这个调用。

 

朋友的确定

在代码中,类与类之间的朋友,是满足下面的条件之一的:

         1当前对象本身(this)

         2以参量形式传入当前对象方法中的对象

         3当前对象的实例变量直接引用的对象

         4当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友

         5当前对象所创建的对

满足上面条件之一就是朋友,否则就是陌生人。

         记住,这里的朋友定义,可不是朋友的朋友就是朋友。在我们的设计中,和自己的朋友打交道即可,别管陌生人。

         

你可能感兴趣的:(迪米特法则)