admin管理员组文章数量:1567271
"笛米特法则":这是说"你的类对其它类知道的越少越好";
1.概念:
一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
2.模拟场景:
场景:公司财务总监发出指令,让财务部门的人去统计公司已发公司的人数。
一个常态的编程:(肯定是不符LoD的反例)
UML类图:
代码演示:
namespace TestLibrary.ExtensionsClass
{
using System;
using System.Collections.Generic;
/// <summary>
/// 财务总监
/// </summary>
public class CFO
{
/// <summary>
/// 财务总监发出指令,让财务部门统计已发工资人数
/// </summary>
public void Directive(Finance finance)
{
List<Employee> employeeList = new List<Employee>();
// 初始化已发工资人数
for (int i = 0; i < 500; i++)
{
employeeList.Add(new Employee());
}
// 转告财务部门开始统计已结算公司的员工
finance.SettlementSalary(employeeList);
}
}
/// <summary>
/// 财务部
/// </summary>
public class Finance
{
/// <summary>
/// 统计已结算公司的员工
/// </summary>
public void SettlementSalary(List<Employee> employeeList)
{
Console.WriteLine(string.Format("已结算工资人数:{0}", employeeList.Count));
}
}
/// <summary>
/// 员工
/// </summary>
public class Employee
{
}
/// <summary>
/// 主程序
/// </summary>
public class Runner
{
public static void main(String[] args)
{
CFO cfo = new CFO();
// 财务总监发出指令
cfo.Directive(new Finance());
}
}
}
根据模拟的场景:财务总监让财务部门总结已发工资的人数。 财务总监和员工是陌生关系(即总监不需要对员工执行任何操作)。根据上述UML图和代码解决办法显然可以看出,上述做法违背了LoD法则。
依据LoD法则解耦:(符合LoD的例子)
UML类图:
代码演示:
namespace TestLibrary.ExtensionsClass
{
using System;
using System.Collections.Generic;
/// <summary>
/// 财务总监
/// </summary>
public class CFO
{
/// <summary>
/// 财务总监发出指令,让财务部门统计已发工资人数
/// </summary>
public void Directive(Finance finance)
{
// 通知财务部门开始统计已结算公司的员工
finance.SettlementSalary();
}
}
/// <summary>
/// 财务部
/// </summary>
public class Finance
{
private List<Employee> employeeList;
//传递公司已工资的人
public Finance(List<Employee> _employeeList)
{
this.employeeList = _employeeList;
}
/// <summary>
/// 统计已结算公司的员工
/// </summary>
public void SettlementSalary()
{
Console.WriteLine(string.Format("已结算工资人数:{0}", employeeList.Count));
}
}
/// <summary>
/// 员工
/// </summary>
public class Employee
{
}
/// <summary>
/// 主程序
/// </summary>
public class Runner
{
public static void main(String[] args)
{
List<Employee> employeeList = new List<Employee>();
// 初始化已发工资人数
for (int i = 0; i < 500; i++)
{
employeeList.Add(new Employee());
}
CFO cfo = new CFO();
// 财务总监发出指令
cfo.Directive(new Finance(employeeList));
}
}
}
根据LoD原则我们需要让财务总监和员工之间没有之间的联系。这样才是遵守了迪米特法则。
版权声明:本文标题:Java设计模式 七大原则(六)迪米特法则(Law Of Demeter) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1725281285a1016534.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论