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

定义

  迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP)。

  一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,它的内部是如何复杂都和自己没关系,只需知道它提供的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; }
    }
}


 

参考:

http://www.cnblogs.com/wisdo/p/4178723.html

 

欢迎阅读本系列文章:Head First设计模式之目录

 

posted @ 2017-08-05 00:27  心存善念  阅读(1821)  评论(0编辑  收藏  举报