设计模式七大原则之迪米特法则
迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用
如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽力少的影响其他模块,扩展会相对容易。这是对软件实体之间通信的限制。迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。
迪米特法则还有几种定义形式:不要和“陌生人”说话,只与你的直接朋友通信等。在迪米特法则中,对于一个对象,其“朋友”包括以下几类:
(1)当前对象本身(this)
(2)以参数形式传入到当前对象方法中的对象
(3)当前对象的成员对象
(4)如果当前对象的成员对象是一个集合,那么集合中的元素也都是朋友
(5)当前对象所创建的对象
任何一个对象,如果满足上面的条件之一,就是当前对象的“”朋友“,否则就是陌生人,在应用迪米特法则时,一个对象只能与直接朋友发生交互,不要与陌生人发生直接交互,这样做可以降低系统的耦合度,一个对象的改变不会给太多其他对象带来影响。
迪米特法则要求在设计系统时,应该尽量减少对象之间的交互。如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用。如果其中一个对象需要调用另一个对象的方法,可以通过第三者转发这个调用。简言之,就是通过引入一个合理的第三者来降低现有对象的耦合度。
下面举个简单的例子来理解一下:
1 /// <summary> 2 /// 甲 3 /// </summary> 4 public class Jia 5 { 6 public void Play(Frenid frenid) 7 { 8 frenid.Play(); 9 } 10 public void Play(Stranger stranger) 11 { 12 stranger.Play(); 13 } 14 15 } 16 17 18 /// <summary> 19 /// 甲的朋友 20 /// </summary> 21 public class Frenid 22 { 23 public void Play() 24 { 25 Console.WriteLine("朋友"); 26 } 27 } 28 29 /// <summary> 30 /// 陌生人 31 /// </summary> 32 public class Stranger 33 { 34 public void Play() 35 { 36 Console.WriteLine("陌生人"); 37 } 38 }
甲和甲的朋友,因为认识可以在一起玩,但甲和甲的朋友的朋友是陌生人,所以不能直接一起玩,需要透过甲的朋友,才能和陌生人一起玩,上面的例子存在问题,甲和陌生人不认识,没有办法直接一起玩,这个时候我们通过迪米特原则来进行修改
1 /// <summary> 2 /// 甲 3 /// </summary> 4 public class Jia 5 { 6 public void Play(Frenid frenid) 7 { 8 frenid.Play(); 9 var stranger = frenid.GetStrangerInstance(); 10 stranger.Play(); 11 } 12 13 } 14 15 16 /// <summary> 17 /// 甲的朋友 18 /// </summary> 19 public class Frenid 20 { 21 public Stranger GetStrangerInstance() 22 { 23 return new Stranger(); 24 } 25 26 public void Play() 27 { 28 Console.WriteLine("朋友"); 29 } 30 } 31 32 /// <summary> 33 /// 甲的朋友的朋友(陌生人) 34 /// </summary> 35 public class Stranger 36 { 37 public void Play() 38 { 39 Console.WriteLine("陌生人"); 40 } 41 }