1. 背景

     类与类之间的关系越密切,耦合度越大,当一个类发生变化时,对另一个类的影响也越大。

2. 定义

    一个类应该对其它类保持最少的了解。

3. 解决方法

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

4. 迪米特法则的核心

      低耦合

5.迪米特法则深究

  只与直接的朋友通信。
   每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。
     耦合的方式很多,依赖、关联、组合、聚合等。其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友, 而出现在局部变量中的类则不是直接的朋友。也就是说,陌生的类最好不要作为局部变量的形式出现在类的内部。

6. 模拟业务场景

  有一个集团公司,下面有很多分公司,现在要求,总公司打印出所有分公司员工的信息。剖析:总公司有很多员工(Employee),分公司里也有很多员工(SubEmployee);总公司与公司的员工、总公司与分公司、分公司与分公司的员工是直接朋友;总公司和分公司的员工不是直接朋友。

先看一个违反了迪米特法则的设计方式:

     /// <summary>
/// 总公司员工类
/// </summary>
public class Employee
{
private string id;
public void setId(string id)
{
this.id = id;
}
public string getId()
{
return id;
}
}
     /// <summary>
/// 分公司员工类
/// </summary>
public class SubEmployee
{
private string id;
public void setId(string id)
{
this.id = id;
}
public string getId()
{
return id;
}
}
     /// <summary>
/// 分公司管理类
/// </summary>
public class SubCompanyManager
{
/// <summary>
/// 获取分公司员工信息
/// </summary>
/// <returns></returns>
public List<SubEmployee> getAll()
{
List<SubEmployee> list = new List<SubEmployee>();
for (int i = ; i < ; i++)
{
SubEmployee sel = new SubEmployee();
sel.setId("分公司员工" + i);
list.Add(sel);
}
return list;
} }
 /// <summary>
/// 总公司管理类
/// </summary>
public class CompanyManager
{
/// <summary>
/// 获取总公司员工信息
/// </summary>
/// <returns></returns>
public List<Employee> getAll()
{
List<Employee> list = new List<Employee>();
for (int i = ; i < ; i++)
{
Employee sel = new Employee();
sel.setId("总公司公司员工" + i);
list.Add(sel);
}
return list;
}
/// <summary>
/// 打印总公司员工信息
/// </summary>
public void printEmployee()
{
foreach (var item in this.getAll())
{
Console.WriteLine(item.getId());
}
}
/// <summary>
/// 打印分公司员工信息
/// </summary>
public void printSubEmployee(SubCompanyManager sub)
{
//这里违背了迪米特法则,直接操控了分公司的员工,总公司和分公司员工不应该是直接关系
foreach (var item in sub.getAll())
{
Console.WriteLine(item.getId());
}
} }
    public static void show()
{
//模拟业务场景:有一个集团公司,下面有很多分公司,现在要求,总公司打印出所有分公司员工的信息。
//剖析:总公司有很多员工(Employee),分公司里也有很多员工(SubEmployee);总公司与公司的员工、总公司与分公司、分公司与分公司的员工是直接朋友;
//总公司和分公司的员工不是直接朋友 //下面先看一个违反了迪米特法则的设计:总公司管理类CompanyManager中直接操作了分公司的员工。
//printSubEmployee方法中违背了迪比特法则,违背了迪米特法则,直接操控了分公司的员工,总公司和分公司不应该是直接关系
CompanyManager cManager = new CompanyManager();
cManager.printSubEmployee(new SubCompanyManager()); }

总结:总公司管理类CompanyManager中直接操作了分公司的员工。printSubEmployee方法中违背了迪比特法则,违背了迪米特法则,直接操控了分公司的员工,总公司和分公司不应该是直接关系。

改进后的设计:给SubCompanyManager类中添加打印分公司员工的方法,然后再CompanyManager中,直接调用打印分公司员工的方法,这样就是总公司依赖了分公司,得到了分公司员工的信息,并没有直接依赖分公司员工。

     /// <summary>
/// 分公司管理类
/// </summary>
public class SubCompanyManager
{
/// <summary>
/// 获取分公司员工信息
/// </summary>
/// <returns></returns>
public List<SubEmployee> getAll()
{
List<SubEmployee> list = new List<SubEmployee>();
for (int i = ; i < ; i++)
{
SubEmployee sel = new SubEmployee();
sel.setId("分公司员工" + i);
list.Add(sel);
}
return list;
} /// <summary>
/// 新增:打印分公司员工信息,为了满足迪米特法则
/// </summary>
public void printSubEmployee()
{
foreach (var item in this.getAll())
{
Console.WriteLine(item.getId());
}
} }
     /// <summary>
/// 总公司管理类
/// </summary>
public class CompanyManager
{
/// <summary>
/// 打印分公司员工信息2
/// </summary>
public void printSubEmployee2(SubCompanyManager sub)
{
//这里总公司直接依赖分公司,得到了分公司员工信息,遵循了迪米特法则
sub.printSubEmployee();
} }
    public static void show()
{
//模拟业务场景:有一个集团公司,下面有很多分公司,现在要求,总公司打印出所有分公司员工的信息。
//剖析:总公司有很多员工(Employee),分公司里也有很多员工(SubEmployee);总公司与公司的员工、总公司与分公司、分公司与分公司的员工是直接朋友;
//总公司和分公司的员工不是直接朋友 //下面先看一个违反了迪米特法则的设计:总公司管理类CompanyManager中直接操作了分公司的员工。
//printSubEmployee方法中违背了迪比特法则,违背了迪米特法则,直接操控了分公司的员工,总公司和分公司不应该是直接关系
CompanyManager cManager = new CompanyManager();
cManager.printSubEmployee(new SubCompanyManager()); //下面是改进后的方案,遵循迪米特法则,给SubCompanyManager类中添加打印分公司员工的方法,然后再CompanyManager中,直接调用打印分公司员工的方法
//这样就是总公司依赖了分公司,得到了分公司员工的信息,并没有直接依赖分公司员工 Console.WriteLine("--------------------下面是采用迪米特法则改进后的方案-----------------------");
cManager.printSubEmployee2(new SubCompanyManager()); }

05-迪米特法则(LOD 又名: 最少知道原则)的更多相关文章

  1. 11. 无数人难办事? - 迪米特法则(LoD)

    11.1 第一天上班 时间: 4月2日19点   地点: 小菜大鸟住所的客厅   任务: 小菜, 大鸟      "回来啦! 怎么样? 第一天上班感受多吧." 大鸟关关心的问道.  ...

  2. 设计模式之迪米特原则(LOD)(最少知识原则)

    来源:迪米特法则(LoD)最初是用来作为面向对象的系统设计风格的一种法则,是很多著名系统,如火星登陆软件系统.木星的欧罗巴卫星轨道飞船的软件系统的指导设计原则. 迪米特法则(LoD)又可分为两种:狭义 ...

  3. 设计模式--迪米特法则(Lod/LKP)

    迪米特法则:(Law of Demeter, LoD),也称最少知识原则(Least Knowledge Principle, LKP) 理解:      假设两个类不必彼此直接通信,那么这两个类就不 ...

  4. 5迪米特法则LoD

    一.什么是迪米特法则 迪米特法则(Law of Demeter )又叫做最少知识 原则,也就是说,一个对象应当对其他对象尽可 能少的了解. 迪米特法则最初是用来作为面向对象的系统设 计风格的一种法则, ...

  5. IOS设计模式的六大设计原则之迪米特法则(LOD,Law Of Demeter)

    定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle).如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中的一个类需要调用 ...

  6. 迪米特法则(LoD)

    如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用.其根本思想是类之间的松耦合. 类之间的耦合越弱,越有利于 ...

  7. 【设计模式六大原则5】迪米特法则(Law Of Demeter)

      定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 自从我们接触编程开始 ...

  8. 迪米特法则(Law Of Demeter)

    定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 自从我们接触编程开始,就 ...

  9. 设计模式之模板方法模式&&迪米特法则(代码Objective-C展示)

    模板方法模式 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变一个算法的结构即可重定义该算法的某些特定步骤. 比如说,小时候数学老师的随堂检测,都是在黑板 ...

随机推荐

  1. From CORBA technology To Thrift technology

    技术在变,需求不变,把复杂的事情搞简单,而不是相反. 无论CORBA还是Thrift,目标只有一个:一处定义,多处使用,解决的问题只有一个:规范和简化客户端与服务器的通信的开发工作. 是不是和java ...

  2. Excel读写方案XLSReadWriteII使用技巧总结

    XLSReadWriteII是一个读写Excel的组件.他的一般已用只要按照Demo操作基本都能实现,只要不是非常复杂的应用,XLSReadWriteII还是能够胜任的. 最近被派了一个写入图库的应用 ...

  3. ESXi安装时遇到不识别的硬件的处理

    1. 部门新购置了一台inspur 四路 NF8480M4的服务器. 上架之后发现ESXi的标准安装盘无法安装. 找不到磁盘安装介质. 2. 处理办法, 找浪潮专家服务,报上序列号,要上相关的一些软件 ...

  4. 给kali linux2.0装一个中文输入法

    没有中文输入法好痛苦啊.. 毕竟做了无限网卡,虚拟机和主机可以完完全全当两台设备使用了,所以kali还是需要一个中文输入法才方便. 由于使用的是比较新的kali版本和源,现在安装fcitx已经可以直接 ...

  5. 理解 Delphi 的类(十) - 深入方法[17] - 提前声明

    //要点17: 如果前面的方法要调用后面的方法, 后面的方法需要提前声明 function MyFunB(x: Integer): Integer; forward; {使用 forward 指示字提 ...

  6. SSM三大框架整合配置(Spring+SpringMVC+MyBatis)

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  7. obj.attr = 5 == obj._dict_["attr"] = 5,调用super相当于调用父类方法进行重新构造

  8. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  9. Leetcode 347.前K个高频元素 By Python

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...

  10. Leetcode 344.反转字符串 By Python

    请编写一个函数,其功能是将输入的字符串反转过来. 示例: 输入:s = "hello" 返回:"olleh" 思路 Python里面的切片用来解决这个问题就很快 ...