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


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

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

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

    (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     }
  • 相关阅读:
    CentOS7如何升级ruby版本
    多线程面试题:现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?(转载)
    hive举例实现字数统计
    hive单用户模式安装
    hadoop实例:电子商务网站商品推荐系统
    安装hadoop-eclipse-plugin 插件(win7)
    hadoop高可用分布式集群安装HDFS +yarm
    hadoop伪分布式安装(单机版) HDFS +Yarn
    Hadoop理论原理
    小技巧:oracle锁表杀进程
  • 原文地址:https://www.cnblogs.com/yangda/p/11954317.html
Copyright © 2020-2023  润新知