定义:

一个对象应该对其它的对象保持最少的了解。迪米特法则又称为最少知识法则,英文全称为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. python : HTML+CSS (左侧菜单)

    左侧菜单 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3 ...

  2. MVC 强类型ViewData[] TempData[]

    一.ViewData[] //赋值 ViewData["u"]="值"; //取值 数据类型 u= ViewData["u"] as 数据类 ...

  3. 红字差评系列2.dwarf

    [题目分析] 首先按照题目给出的样例想到只要每个物品的价格都用能够合成他的两个物品来更新,一边读入一边更新就好了,后来又发现如果出现这样的情况:1 2 3在2 5 6 的前面,那我们就需要先更新2在更 ...

  4. [转]unicode,ansi,utf-8,unicode big endian的故事

    unicode,ansi,utf-8,unicode big endian的故事很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的 ...

  5. python pip install

    wget --no-check-certificate https://github.com/pypa/pip/archive/1.5.5.tar.gz https://github.com/pypa ...

  6. MultiProvider

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. Pycharm使用问题# Interpreter设置

    Pycharm可以迅速更换interpreter版本. 在菜单栏选择File-Settings打开Settings设置对话框,选择展开Interpreter选项: 使用列表右侧的+和—即可增加和删除I ...

  8. C++ 高质量编程附录试题

    附录B :C++/C试题 本试题仅用于考查C++/C程序员的基本编程技能.内容限于C++/C常用语法,不涉及数据结构.算法以及深奥的语法.考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不 ...

  9. 如何myEclipse修改工程项目的运行环境和编译环境

    修改工程运行环境(开发环境)JRE 右击工程名-----选择properties----选择对话框左侧的java build path----查看使用的JRE 选择Library选项卡中的,选中使用中 ...

  10. 2-c语言作业

    #include<stdio.h> #include<math.h> int main(void) { int money,year; double rate,sum; pri ...