设计模式七大原则之迪米特法则

迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用

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

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

(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     }

 

posted @ 2019-11-28 22:33  虔城墨客  阅读(309)  评论(0编辑  收藏  举报