迪米特法则的定义

  迪米特法则又叫做最少知识原则。它的定义是:只与你的直接朋友交谈,不和陌生人说话。其含义是如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用。可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块之间的相对独立性

  迪米特法则中的朋友是指:当前对象本身、当前对象的成员变量、当前对象所创建的对象、当前对象的方法参数等。这些对象同当前对象存在关联、聚合、组合关系,可以直接访问这些对象的方法。

  狭义理解:一个对象应该对其他对象有最少的了解。通俗的将,一个类应该对自己需要耦合或调用的类知道的最少。它的内部如何复杂如何实现都无须关心。只需要知道它的public方法。

  广义理解:

    一个模块设计的好坏的一个重要标志就是该模块在多大程度上将自己的内部数据和实现的有关细节隐藏起来。

    一个软件实体应当尽可能少的与其他实体类发生交互。降低软件实体之间的耦合。

    每一个软件单位对其他的但愿都只有最少的知识。而且局限于那些与本单位密切相关的软件单位。

 

迪米特原则的目的:

  降低类之间的耦合度。每个类都尽量减少对其他类的依赖。因此,系统的各个功能模块独立性提高。那么可复用性也会提高

 

迪米特原则的优点

  类间解耦、弱耦合。提高类的可复用性

 

迪米特原则的缺点

   造成系统的不同模块之间的通信效率降低,是系统的不同模块之间不容易协调。

   由于迪米特法则要求类与类之间尽量不要直接通信。而是通过第三方转发。因此可能出现系统中存在大量的第三方中介类。增加系统复杂度。而解决这个问题的方法就在于。使用依赖倒置原则。面向接口编程。此时调用方(高层)和被调用方(低层)之间就有了一个抽象层。让抽象层作为第三方类。

namespace DesignPrinciples.LowOfDemeter
{
    class Program
    {
        static void Main(string[] args)
        {
            GroupLeader group = new GroupLeader();
            Teacher teacher = new Teacher();
            teacher.Command(group);
            Console.WriteLine("==== 我是分割线 ====");
            teacher.CommandByDemeter(group);
        }
    }

    public class Teacher
    { 
        /// <summary>
        /// 教师发送命令
        /// </summary>
        /// <param name="group"></param>
        public void Command(GroupLeader group)
        {
            List<Student> students = new List<Student>();
            for (int i = 0; i < 20; i++)
            {
                students.Add(new Student());
            }
            group.Count(students);
        }

        public void CommandByDemeter(GroupLeader group)
        { 
            group.CountByDemeter();
        }
    }

    public class GroupLeader
    {
        /// <summary>
        /// 学习委员点名
        /// </summary>
        /// <param name="girls"></param>
        public void Count(List<Student> girls)
        {
            Console.WriteLine("学生人数:" + girls.Count);
        }

        public void CountByDemeter()
        {
            List<Student> students = new List<Student>();
            for (int i = 0; i < 20; i++)
            {
                students.Add(new Student());
            }
            Console.WriteLine("学生人数(迪米特):" + students.Count);
        }
    }

    public class Student
    {
        public string Name { get; set; }
    }
}