設計模式七大原則之迪米特法則

迪米特法則:一個軟件實體應當儘可能少的與其他實體發生相互作用

如果一個系統符合迪米特法則,那麼當其中某一個模塊發生修改時,就會盡力少的影響其他模塊,擴展會相對容易。這是對軟件實體之間通信的限制。迪米特法則要求限制軟件實體之間通信的寬度和深度。迪米特法則可降低系統的耦合度,使類與類之間保持鬆散的耦合關係。

迪米特法則還有幾種定義形式:不要和“陌生人”說話,只與你的直接朋友通信等。在迪米特法則中,對於一個對象,其“朋友”包括以下幾類:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章