zoukankan      html  css  js  c++  java
  • 设计模式七大原则之迪米特法则

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

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

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

    (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     }
  • 相关阅读:
    玩转html2canvas以及常见问题解决
    docker磁盘空间清理办法
    统计行数、文件夹个数、文件个数的相关shell命令
    golang将字符串进行md5加密
    思考如何将自动化测试加入持续集成中
    锋利的NodeJS之NodeJS多线程
    成年人的必修课:抗压和自驱力
    MacOS下PHP7.1升级到PHP7.4.15
    php性能分析利器:xhprof
    后Low Code时代:聚焦和突破
  • 原文地址:https://www.cnblogs.com/yangda/p/11954317.html
Copyright © 2011-2022 走看看