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

定义

  迪米特法则(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设计模式之目录

 

时间: 2024-09-19 22:44:39

七大设计原则之迪米特法则的相关文章

设计模式之(1)设计原则

*开-闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开发,对修改关闭.说的是,再设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展.换言之,应当可以在不必修改源代码的情况下改变这个模块的行为. *.UML(统一建模语言, Unified Modeling Language),是OMG(Object Management Group)在1997年发表的图标式软件设计语言. 1.类图中的关系:(1).一般化关系:(Generalization)  

23、Python与设计模式--设计原则

一.六大设计原则 在法理学中,法律规则与法律原则都是法律规范的重要构成.但二者也会有些不同:法律规则是指采取一定的结构形式具体规定人们的法律权利.法律义务以及相应的法律后果的行为规范,内容比较明确,比如,交通法规中规定,禁止闯红灯:法律原则是指在一定法律体系中作为法律规则的指导思想,基本或本原的.综合的.稳定的原理和准则,内容上只包含"大方针",而并未有具体规则,比如,如果车上有马上临产的孕妇,闯红灯不会被处罚,这是符合重视生命的原则.设计模式与设计原则,基本符合规则与原则的关系,设计

OOAD之面向对象设计原则

学习这个设计模式 真的觉得很抽象,只有自己多多的领会! 在很多时候,很多的知识都会觉得讲起来是很矛盾的. 本章目标 1 掌握内聚度和耦合度的概念 2 掌握面向对象设计原则    (一)如何衡量软件设计的质量 内聚度:表示一个应用程序的单个单元所负责的任务数量和多样性.内聚与单个类或者单个方法单元相关.(在我自己的理解就是:在一个类中完成自己所有的任务,这些任务都在自己的类中.自己的事情自己做) 耦合度:耦合度表示类之间关系的紧密程度.耦合度决定了变更一个应用程序的容易程度.在紧密耦合的类结构中,

《设计模式》学习笔记1——七大面向对象设计原则

前言 根据这一次的学习计划,系统学习设计模式之前,先系统学习和理解设计原则.面向对象设计原则有如下几类. 原则一:单一职责原则 这是面向对象最简单的原则,对于定义,引用书中所说: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因 这里最重要的地方,我个人觉得应该是一个功能领域这一句. 设计的前提是思考,只有进行了思考才能谈得上设计,所以实际设计过程中最重要的还

设计模式原则(单一、开放封闭、里氏代换、依赖倒转、迪米特法则五大原则)

原文:设计模式原则(单一.开放封闭.里氏代换.依赖倒转.迪米特法则五大原则) 单一职责原则 单一职责原则,就一个类而言,应该仅有一个引起它变化的原因.   如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,当变化发生时,设计会遭受到意想不到的破坏.事实上,我们完全可以找出来进行分类,分离.   软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离.其实要去判断是否应该分离出类来,也不难,那就是如果你能够想到多余一个的动机去改变

设计模式六大原则--迪米特法则

       背景        在学校学习时,可能因为某些事你得去其他二级学院的老师帮忙,大部分老师都是忙的(也许是的)很可能一件小事你要跑很多次.但是如果你这件事直接找的是其他学院的院长,并且院长同意帮忙的话这件事解决起来就容易多了.不知怎地最近老是瞎想感觉这件事又能和设计模式中的迪米特法则(Law of Demeter,LOD),也叫最少知识原则(Least Knowledge Principle,LKP)扯上关系,接下来就由小生带大家粗略的了解一下这个法则吧.        定义    

设计模式六大原则(5):迪米特法则

定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合.          自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚.无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率.低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的.          迪米特法则又叫最少知道原则,最早是在1987年

设计模式六大原则——迪米特法则(LoD)

    1.背景      在图书馆借书,刚开始的时候,直接跑到相应的楼层去,到里面去转,去找要借的书,在里面溜达半天才能找到:后来知道图书馆有一个电脑查询处,然后直接在电脑上输入想要借的书,电脑就会显示你想要借的书的信息,还有所在的相关楼层存放的相关位置.                2.定义      迪米特法则(Law of Demeter)又叫作最少知识原则(LKP,Least Knowledge Principle),就是说一个对象应当对其他对象有尽可能少的了解,类与类之间的了解的越

设计模式之禅之六大设计原则-迪米特原则

迪米特法则 一:迪米特法则定义:        ---->迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least KnowledgePrinciple,LKP),        ---->一个对象应该对其他对象有最少的了解.通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心. 二:迪米特法则对类的低耦合提出明确的要求.