面向对象设计原则之迪米特法则

迪米特法则来自于1987年美国东北大学(Northeastern University)一个名为“Demeter”的研究项目。迪米特法则又称为最少知识原则(LeastKnowledge Principle, LKP),其定义以下:函数

迪米特法则(Law of  Demeter, LoD):一个软件实体应当尽量少地与其余实体发生相互做用。this

      若是一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽可能少地影响其余模块,扩展会相对容易,这是对软件实体之间通讯的限制,迪米特法则要求限制软件实体之间通讯的宽度和深度。迪米特法则可下降系统的耦合度,使类与类之间保持松散的耦合关系。spa

      迪米特法则还有几种定义形式,包括不要和“陌生人”说话只与你的直接朋友通讯等,在迪米特法则中,对于一个对象,其朋友包括如下几类:设计

      (1) 当前对象自己(this);对象

      (2) 以参数形式传入到当前对象方法中的对象;事件

      (3) 当前对象的成员对象;ip

      (4) 若是当前对象的成员对象是一个集合,那么集合中的元素也都是朋友;ci

      (5) 当前对象所建立的对象。开发

      任何一个对象,若是知足上面的条件之一,就是当前对象的“朋友”,不然就是“陌生人”。在应用迪米特法则时,一个对象只能与直接朋友发生交互,不要与“陌生人”发生直接交互,这样作能够下降系统的耦合度,一个对象的改变不会给太多其余对象带来影响。it

      迪米特法则要求咱们在设计系统时,应该尽可能减小对象之间的交互,若是两个对象之间没必要彼此直接通讯,那么这两个对象就不该当发生任何直接的相互做用,若是其中的一个对象须要调用另外一个对象的某一个方法的话,能够经过第三者转发这个调用。简言之,就是经过引入一个合理的第三者来下降现有对象之间的耦合度

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

      下面经过一个简单实例来加深对迪米特法则的理解:

      Sunny软件公司所开发CRM系统包含不少业务操做窗口,在这些窗口中,某些界面控件之间存在复杂的交互关系,一个控件事件的触发将致使多个其余界面控件产生响应,例如,当一个按钮(Button)被单击时,对应的列表框(List)、组合框(ComboBox)、文本框(TextBox)、文本标签(Label)等都将发生改变,在初始设计方案中,界面控件之间的交互关系可简化为如图1所示结构:

图1 初始设计方案结构图

      在图1中,因为界面控件之间的交互关系复杂,致使在该窗口中增长新的界面控件时须要修改与之交互的其余控件的源代码,系统扩展性较差,也不便于增长和删除新控件。

      现使用迪米特对其进行重构。

      在本实例中,能够经过引入一个专门用于控制界面控件交互的中间类(Mediator)来下降界面控件之间的耦合度。引入中间类以后,界面控件之间再也不发生直接引用,而是将请求先转发给中间类,再由中间类来完成对其余控件的调用。当须要增长或删除新的控件时,只需修改中间类便可,无须修改新增控件或已有控件的源代码,重构后结构如图2所示: