Java设计模式 七大原则(六)迪米特法则(Law Of Demeter)

"笛米特法则":这是说"你的类对其它类知道的越少越好";

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原则我们需要让财务总监和员工之间没有之间的联系。这样才是遵守了迪米特法则。

猜你喜欢

转载自blog.csdn.net/Hurricane_m/article/details/89322173