开一个小专题——详细总结一下软件设计模式原则,这部分在《软计》和《java设计模式》中算是很重要的知识点,值得展开详细讲解一下~首先介绍的是【迪米特法则】
迪米特法则又称为最少知识原则,其定义为:一个软件实体应当尽可能少的与其他实体发生相互作用。
英文缩写为:LOD
如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
如果一个系统满足迪米特法则,那么当其中一个软件实体发生变化时,就会尽量少的影响其他软件实体,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。
迪米特法则还有几种定义形式,包括:不要和"陌生人"说话、只与你的直接朋友通信,在迪米特法则中,对于一个对象,其朋友包括以下几类:
任何一个对象,如果满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。在应用迪米特法则时,一个对象只能与直接朋友发生交互,不能与“陌生人”发生直接交互,好处在于降低耦合~
迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象不必直接通信,那么这两个对象就不应该发生任何直接的相互作用,如果其中一个对象需要调用另外一个对象的某个方法时,可以通过【友元类】转发这个调用。
在迪米特法则运用到系统设计中时,要注意以下几点:
假设现在有一段时间,需要你学习某些内容,有代码如下:
- public class Time{
- public void studyMath() {
- // do something
- }
- public void studyChinese() {
- // do something
- }
- public void studyEnglish() {
- // do something
- }
-
-
- public void study() {
- studyEnglish();
- studyChinese();
- studyMath();
- }
- }
-
- public class Person {
- private Time time;
-
- public void Now() {
- // 学习什么都可以
-
- // 但是你发现Study类所有的方法都是公开的, 现在不知道该先学习哪个?
- time.studyMath();
- time.study();
- //也可以是
- time.studyMath();
- time.studyEnglish();
- }
- }
上述代码违背了迪米特原则,即对于对象time,此时不知道该学习什么——有多个方法可以调用~
(学一门,还是三门都学?)
如果改为如下的样式,则正确:
- public class Time{
- private void studyMath() {
- // do something
- }
- private void studyChinese() {
- // do something
- }
- private void studyEnglish() {
- // do something
- }
-
-
- public void study() {
- studyEnglish();
- studyChinese();
- studyMath();
- }
- }
-
- public class Person {
- private Time time;
-
- public void Now() {
- // 学习什么都可以
-
- // 但是你发现Study类所有的方法都是公开的, 现在不知道该先学习哪个?
- time.studyMath();
- time.study();
- //也可以是
- time.studyMath();
- time.studyEnglish();
- }
- }
总结就是一句话——尽可能降低现有的耦合,避免直接调用。