定义:

一个对象应该对其它的对象保持最少的了解。迪米特法则又称为最少知识法则,英文全称为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. 夺命雷公狗-----React---6--props多属性的传递

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 【01:转自知乎:关于 openSUSE 】

    我是 openSUSE 中文维基唯一的非官方维护者,openSUSE 简体中文翻译团队召集人,linuxsir SuSE 版块的版主,openSUSE 官方论坛 http://forums.opens ...

  3. sqlyong64位破解

    姓名(Name):cr173 序列号(Code):8d8120df-a5c3-4989-8f47-5afc79c56e7c 或者(OR) 姓名(Name):cr173 序列号(Code):59adfd ...

  4. 封装Js库从获取控件的value值开始

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  5. TCMalloc的使用

    Windows下: 1. 编译libtcmalloc_minimal,编成静态的动态的都可以. 2. 在链接中设置附加依赖库libtcmalloc_minimal.lib,并且强制符号引用要加上__t ...

  6. em

    macro jumptocaller(){    JumpToLocation(GetSymbolLocation((GetCurSymbol ())))}

  7. 转 java中的session

    书中讲:以下情况,Session结束生命周期,Servlet容器将Session所占资源释放:1.客户端关闭浏览器2.Session过期3.服务器端调用了HttpSession的invalidate( ...

  8. 有向图的强连通图——Kosaraju

    有向图的强连通分量: 相互可达关系,每一个集合都是有向图的一个强连通分量SCC. 把一个集合看成一个点,SCC就形成了一个有向无环图——DAG;       如果DFS选择不好,从A点开始DFS,就会 ...

  9. SnowNLP:一个处理中文文本的 Python 类库

    https://segmentfault.com/a/1190000000362372

  10. 【小白入门向】tarjan算法+codevs1332上白泽慧音 题解报告

    一.[前言]关于tarjan tarjan算法是由Robert Tarjan提出的求解有向图强连通分量的算法. 那么问题来了找蓝翔!(划掉)什么是强连通分量? 我们定义:如果两个顶点互相连通(即存在A ...