定义:

一个对象应该对其它的对象保持最少的了解。迪米特法则又称为最少知识法则,英文全称为Least Knowledge Principle ,简称为LKP。

个人理解:

迪米特法则主要目的是类间解耦,弱耦合。只有类弱耦合了后,类的复用性才会提高。

问题由来:

类之间的关系越密切,类之间的耦合程度越高。当一个类发改变时,耦合度越大,对另一类的影响也就越大。

解决方案:

尽量降低类之间的耦合度。

从事编程的都知道,软件编程总的原则是低耦合、高内聚,只有这样才能提高代码的复用率,而这正是迪米特法则所要求的。迪米特法则还有一个更简单的定义:只与直接的朋友通信。首先来解释一下什么是直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。

举例说明:

老师(Teacher类)对组长(GroupLeader类)发布命令,组长对女生(Gril类)人数统计并输出来。违反迪米特法则的代码如下所示:

public class Girl
    {

    }

    public class GroubLeader
    {
        //有清查女生的工作
        public void CountGrilNumber(List<Girl> girlslist)
        {
            Console.WriteLine("女生的数量是"+girlslist.Count);
        }
    }

    public class Teacher
    {
        public void Command(GroubLeader groubLeader)
        {
            var grilList = new List<Girl>();
            //初始化女生列表
            ; i < ; i++)
            {
                grilList.Add(new Girl());
            }
            //告诉体育委员要清查女生数量
            groubLeader.CountGrilNumber(grilList);
        }
    }
    class Client
    {
        static void Main(string[] args)
        {
            var teacher = new Teacher();
            //老师发布命令
            teacher.Command(new GroubLeader());
            Console.ReadKey();
        }
    }

上面的代码中Teacher初始化了Gril的List列表,老师直接操作女生的列表这显然不符合常规,更不符合迪米特法则,正常的顺序是老师对组长发布命令,组长统计女生人数。类的关系要尽量的解耦,降低他们的耦合度。改进方法是GroupLeader内部私有化一个List<Gril>变量,在构造GroupLeader变量时传递List<Gril>参数,这样就降低了Gril和GroupLeader的耦合度。改进代码如下所示:

public class Girl
    {

    }

    public class GroubLeader
    {
        private readonly List<Girl> _girList;

        public GroubLeader(List<Girl> girlList)
        {
            _girList = girlList;
        }
        //有清查女生的工作
        public void CountGrilNumber()
        {
            Console.WriteLine("女生的数量是" + _girList.Count);
        }
    }

    public class Teacher
    {
        public void Command(GroubLeader groubLeader)
        {

            //告诉体育委员要清查女生数量
            groubLeader.CountGrilNumber();
        }
    }
    class Client
    {
        static void Main(string[] args)
        {
            var girlList = new List<Girl>();
            //初始化女生列表
            ; i < ; i++)
            {
                girlList.Add(new Girl());
            }
            var teacher = new Teacher();
            //老师发布命令
            teacher.Command(new GroubLeader(girlList));
            Console.ReadKey();
        }
    }

上面的例子只是单纯的说明迪米特法则的使用,可能有些牵强,关键还是理解一个对象应尽量对其它对象保持少的了解这句话的意思。

设计模式六大原则(5)—迪米特法则的更多相关文章

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

    转贴: 设计模式六大原则(5):迪米特法则   原帖子的后续评论里面很多值得仔细去看 切记!像21楼 21楼 chenshufei2 2012-09-23 12:47发表 [回复] 上个例子,就是方法 ...

  2. GOF提出的23种设计模式是哪些 设计模式有创建形、行为形、结构形三种类别 常用的Javascript中常用设计模式的其中17种 详解设计模式六大原则

    20151218mark 延伸扩展: -设计模式在很多语言PHP.JAVA.C#.C++.JS等都有各自的使用,但原理是相同的,比如JS常用的Javascript设计模式 -详解设计模式六大原则 设计 ...

  3. PHP 设计模式六大原则

    http://www.cnblogs.com/yujon/p/5536118.html 设计模式六大原则(1):单一职责原则 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 设计模 ...

  4. ZT 设计模式六大原则(6):开闭原则

    ZT 设计模式六大原则(6):开闭原则 分类: 设计模式 2012-02-27 08:48 24870人阅读 评论(72) 收藏 举报 设计模式扩展框架编程测试 定义:一个软件实体如类.模块和函数应该 ...

  5. ZT 设计模式六大原则(4):接口隔离原则

    设计模式六大原则(4):接口隔离原则 分类: 设计模式 2012-02-27 08:32 17948人阅读 评论(21) 收藏 举报 设计模式classinterfacecstring框架 定义:客户 ...

  6. Java设计模式六大原则-2

    Java设计模式六大原则-2 做Java程序开发的每天都在使用JDK,Spring,SpringMvc,Mybatis,Netty,MINA等框架,但很少有人懂得背后的原理.即使打开跟下原码也是一头雾 ...

  7. 设计模式六大原则 All In one

    设计模式六大原则 All In one 开闭原则: 对扩展开放,对修改关闭; 设计模式的六大原则: 0.总原则-开闭原则 对扩展开放, 对修改封闭; 在程序需要进行拓展的时候, 不能去修改原有的代码, ...

  8. GOF业务场景的设计模式-----设计模式六大原则

    单一职责原则(Single Responsibility Principle) 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1, ...

  9. 设计模式六大原则——合成/聚合复用原则(CARP)

    1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合.尽量不要使用继承"呢? 这是由于: 第一,继 ...

  10. ZT 设计模式六大原则(1):单一职责原则

    zt 设计模式六大原则(1):单一职责原则 分类: 设计模式 2012-02-21 09:52 25059人阅读 评论(65) 收藏 举报 设计模式stringclass编程 (THERE SHOUL ...

随机推荐

  1. vsftpd.conf 怎么保存

    引用:http://zhidao.baidu.com/question/169939742.html vsftpd.conf 用vim编辑后如何保存?网上很多我都看了 esc 然后shift+ 不好使 ...

  2. html,移动端代码

    <meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale= ...

  3. Unable to create SVNRepository object

    I think you are missing at least the library setup stuff:     /*      * Initializes the library to w ...

  4. VS2010中qDebug输出乱码的问题

    1.开发环境:安装Qt5.3.2(离线安装包安装):VS版本为:2010 SP1Rel:源代码默认保存格式为GB2312. 2.输出乱码的代码 #include <QtCore/QCoreApp ...

  5. python实现指定目录下JAVA文件单词计数的多进程版本

    要说明的是, 串行版本足够快了, 在我的酷睿双核 debian7.6 下运行只要 0.2s , 简直是难以超越. 多进程版本难以避免大量的进程创建和数据同步与传输开销, 性能反而不如串行版本, 只能作 ...

  6. SpringMVC 手动控制事务提交

    描述 事务还是一个比较好的东东,有了这个,我们在做流程性的东西的时候,就会很好,很nice. 现在看看 SpringMVC 如何实现的,详细请看代码: 1.配置文件 applicationContex ...

  7. 一. HTML认识

    1.1认识什么是纯文本文件txt window自带有一个软件,叫做记事本,记事本保存的格式就是TXT,就是英文text的缩写,术语上称呼为"纯文本文件. TXT文件,只能保存文本内容,是无法 ...

  8. wf(三)

    前言: 到现在我们可以看到,WF4包含一个.xmal 文件的设计器和一个调用活动的runtime.当你创建自己的工作流的时候,你是同时也创建了一个活动, 因为活动是一个继承System.Activit ...

  9. 【leetcode❤python】 1. Two Sum

    #-*- coding: UTF-8 -*- #AC源码[意外惊喜,还以为会超时]class Solution(object):    def twoSum(self, nums, target):  ...

  10. jquery之empty()方法详解

    empty()函数用于清空每个匹配元素内的所有内容. empty()函数将会移除每个匹配元素的所有子节点(包括文本节点.注释节点等所有类型的节点). 该函数属于jQuery对象(实例). 语法 jQu ...