@[TOC](迪米特法则(Law of Demeter))
迪米特法则(Law of Demeter)
迪米特法则来自于1987年美国东北大学的一个名为Demeter的一个研究项目。
迪米特法则又称为最少知道原则
what:什么是迪米特法则
每一个软件单位(每一个微服务、每一个模块、每一个包、每一个类、每一个方法)第其他单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
更加通俗一点,迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用。
why:为什么使用迪米特法则
如果一个系统符合迪米特法则,那么当其中一个软件单位发生修改时就会尽量少的影响其他模块,扩展也会相对容易,这是对软件单位之间通信的限制,迪米特法则要求限制软件单位之间通信的宽度和深度(软件单位与多少软件单位有耦合,软件单位之间的联系的程度)。应用迪米特法则可以降低系统的耦合度,使软件单位之间保持松散的耦合关系。
When、How合适使用、如何运用迪米特法则
迪米特法则要求在设计系统时应该减少软件单位之间的交互,如果两个软件单位之间不必彼此直接通信,那么这两个软件单位就不应该发生任何直接的相互作用,如果其中一个软件单位需要调用另一个软件单位的方法,可以通过第三者转发这个调用。就是引入一个合理的第三者来降低现有软件单位之间的耦合。
运用到系统设计中要注意点
以类为例
1、在类的划分上应当尽量创建松耦合的类,类之间的耦合度越低,就越利于复用,一个处于松耦合的类一旦被修改不会对关联的类造成太大影响;
2.在类的结构设计上,每一个类都应该尽量降低其成员变量和成员函数的访问权限;
3.在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。
示例
某软件公司所开发CRM系统包含甚多业务类操作窗口,在这些窗口中某些界面控件之间存在复杂的交互关系,一个控件事件的触发将导致多个界面控件产生响应。例如:当一个按钮(button)被单击时,对应的列表(list)、组合框(ComboBox)、文本框(TextBox)、文本标签(Label)等都将发生改变。在初始设计方案中,界面控件之间的交互关系可简化为如图:
在图中,由于界面控件之间的交互关系复杂,导致在该窗口中增加新的界面控件时需要修改与之交互的其他控件的源代码,系统扩展性较差,也不便于增加和删除控件。
现在使用迪米特法则进行重构。
在本例中可以通过引入一个专门用于控制界面控件交互的中间类(Mediator)来降低界面控件之间的耦合度。在引入中间类之后,界面控件之间不在直接发生引用,而是将请求先转发给中间类,再由中间类来完成对其他控件的调用。当需要增加或者删除新的控件时只需要修改中间类,无需修改新增控件或者以后控件的源代码。
后记
对于设计模式七大原则的学习,小编的博客只是对小编自己阶段学习的一个总结,其中有不合理的地方环境大家指出一起交流,并且小编学习的内容主要源自于书籍。
参考数据《Java设计模式》、《图解设计模式》。