定义:

一个对象应该对其它的对象保持最少的了解。迪米特法则又称为最少知识法则,英文全称为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. Git Permission denied (publickey).

    有可能, jenkins slave service or jenkins service的logon 账户没有设置好

  2. Oracle数据库DOC命令导入导出(2014-3-10记)

    导出:exp lwj/lwj123456@orcl file=d:/db.dmp full=y 导入:imp lwj/lwj123456@orcl file=d:/db.dmp full=y 注:用户 ...

  3. 【转】VS2010中 C++创建DLL图解

    转载地址:http://blog.csdn.net/g710710/article/details/7255744 一.DLL的创建  创建项目: Win32->Win32项目,名称:MyDLL ...

  4. js基础的知识整理

    一.操作样式: .style   操作行间样式 .className 修改class 二.操作属性 1. .  更简单,操作已有的属性 2. [] 更灵活,点能做的,方括号都能做.方括号中放的是字符串 ...

  5. SharePoint 2013 一些小技巧

    一.添加“SharePoint 2013 切换用户”标签 相比SharePoint 2010,SharePoint2013版本去掉了切换用户登陆的功能(如下图),其实这个可以通过改welcome.as ...

  6. sublime 自动编译

    Tools --> Build System --> New: { "shell_cmd": "cc.bat \"$file\"" ...

  7. background-clip 制作文字火焰效果

    1.Background-clip的语法 background-clip: border-box || padding-box || context-box || no-clip || text 2. ...

  8. InputStream,BufferedImage与byte数组之间的转换

    需要获取网络的一张图片,但是某种需要,要把获取的这段流输入换为BufferedImage流,有的地方还需要转换为byte[]. 获得图片地址,获得了一个图片输入流,例如:    Url img = n ...

  9. EasyUI关于 numberbox,combobox,validatebox 的几个小问题

    在最近的项目中,首次使用到了 网页的一个布局框架——EasyUI,感觉这个框架特别牛,兼容性很不错,页面效果也挺不错,可是在使用标题上三个控件过程中遇到几个很奇特的问题,让我头疼不已,所以在此给广大I ...

  10. (转)QML代码与现有Qt UI代码整合

    http://blog.csdn.net/henreash/article/details/7934315