Java设计模式七大原则之迪米特法则详解

 更新时间:2022年02月08日 15:52:14   作者:温故知新之java  
迪米特法则要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则。本文将为大家详细介绍Java设计模式七大原则之一的迪米特法则,需要的可以参考一下

定义

迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项 目设计提 出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则。

案例

需求

有一个公司,下属有各个部门,现要求打印出公司员工的ID和部门员工的ID

方案一

定义公司员工类

/**
 * 公司员工
 * @author:liyajie
 * @createTime:2022/2/8 11:52
 * @version:1.0
 */
@Data
public class CompanyEmployee {
    private String id;
}

定义公司管理类

/**
 * 公司员工管理员
 * @author:liyajie
 * @createTime:2022/2/8 11:51
 * @version:1.0
 */
public class CompanyManager {

    public List<CompanyEmployee> getCompanyEmployee(){
        List<CompanyEmployee> list = new ArrayList<CompanyEmployee>();
        for (int i = 0; i < 5; i++) {
            CompanyEmployee companyEmployee = new CompanyEmployee();
            companyEmployee.setId("公司员工,id是" + i);
            list.add(companyEmployee);
        }
        return list;
    }
}

定义部门员工类

/**
 * 部门员工
 * @author:liyajie
 * @createTime:2022/2/8 11:53
 * @version:1.0
 */
@Data
public class DempartEmployee {
    private String id;
}

定义部门管理类

/**
 * 部门员工管理员
 * @author:liyajie
 * @createTime:2022/2/8 11:52
 * @version:1.0
 */
public class DepartmentManager {

    /**
     * 获取部门员工信息
     * @author: liyajie
     * @date: 2022/2/8 12:29
     * @param
     * @return java.util.List<com.lyj.mode.principle.demeter.DempartEmployee>
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public List<DempartEmployee> getDempartEmployee(){
        List<DempartEmployee> list = new ArrayList<DempartEmployee>();
        for (int i = 0; i < 5; i++) {
            DempartEmployee dempartEmployee = new DempartEmployee();
            dempartEmployee.setId("部门员工,id是" + i);
            list.add(dempartEmployee);
        }
        return list;
    }

    public void pringAllEmployee(CompanyManager companyManager){
        List<DempartEmployee> dempartEmployeeList = getDempartEmployee();
        for (DempartEmployee dempartEmployee : dempartEmployeeList) {
            System.out.println(dempartEmployee.getId());
        }
        System.out.println("--------------------------------");
        List<CompanyEmployee> companyEmployeeList = companyManager.getCompanyEmployee();
        for (CompanyEmployee companyEmployee : companyEmployeeList) {
            System.out.println(companyEmployee.getId());
        }
    }

}

定义测试类

/**
 * 测试类
 * @author:liyajie
 * @createTime:2022/2/8 11:53
 * @version:1.0
 */
public class Test1 {
    public static void main(String[] args) {
        new DepartmentManager().pringAllEmployee(new CompanyManager());
    }
}

查看结果

方案二

该方案与方案一的区别只有两个地方,具体如下: 修改后的公司管理类,新增打印公司员工id的方法

/**
 * 公司员工管理员
 * @author:liyajie
 * @createTime:2022/2/8 11:51
 * @version:1.0
 */
public class CompanyManagerNew {

    /**
     * 查询公司员工
     * @author: liyajie
     * @date: 2022/2/8 12:42
     * @param
     * @return java.util.List<com.lyj.mode.principle.demeter.CompanyEmployee>
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public List<CompanyEmployee> getCompanyEmployee(){
        List<CompanyEmployee> list = new ArrayList<CompanyEmployee>();
        for (int i = 0; i < 5; i++) {
            CompanyEmployee companyEmployee = new CompanyEmployee();
            companyEmployee.setId("公司员工,id是" + i);
            list.add(companyEmployee);
        }
        return list;
    }

    /**
     * 打印公司员工id
     * @author: liyajie
     * @date: 2022/2/8 12:41
     * @param
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public void printCompanyEmployee(){
        List<CompanyEmployee> list = getCompanyEmployee();
        for (CompanyEmployee companyEmployee: list) {
            System.out.println(companyEmployee.getId());
        }
    }
}

修改后的部门管理类

/**
 * 部门员工管理员
 * @author:liyajie
 * @createTime:2022/2/8 11:52
 * @version:1.0
 */
public class DepartmentManagerNew {

    /**
     * 获取部门员工信息
     * @author: liyajie
     * @date: 2022/2/8 12:29
     * @param
     * @return java.util.List<com.lyj.mode.principle.demeter.DempartEmployee>
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public List<DempartEmployee> getDempartEmployee(){
        List<DempartEmployee> list = new ArrayList<DempartEmployee>();
        for (int i = 0; i < 5; i++) {
            DempartEmployee dempartEmployee = new DempartEmployee();
            dempartEmployee.setId("部门员工,id是" + i);
            list.add(dempartEmployee);
        }
        return list;
    }

    public void pringAllEmployee(CompanyManagerNew companyManagerNew){
        List<DempartEmployee> dempartEmployeeList = getDempartEmployee();
        for (DempartEmployee dempartEmployee : dempartEmployeeList) {
            System.out.println(dempartEmployee.getId());
        }
        System.out.println("--------------------------------");
        companyManagerNew.printCompanyEmployee();
    }

}

测试类

/**
 * 测试类
 * @author:liyajie
 * @createTime:2022/2/8 11:53
 * @version:1.0
 */
public class Test2 {
    public static void main(String[] args) {
        new DepartmentManagerNew().pringAllEmployee(new CompanyManagerNew());
    }
}

结果

对比分析

方案一,在部门管理类DepartmentManager的方法pringAllEmployee中打印了公司员工id,使用到了类CompanyEmployee,该类既不是DepartmentManager的内部属性,也不是方法的入参和返回参数,违反了迪米特原则

方案二,在公司管理类中新增打印公司员工id的方法,并对外提供,在部门管理类DepartmentManager的方法pringAllEmployee中进行了调用,符合迪米特原则

总结

  • 迪米特法则的核心是降低类之间的耦合
  • 从被依赖者的角度来说,尽量将逻辑封装在类的内部,对外除了提供的public方法,不泄露任何信息
  • 从依赖者的角度来说,只依赖应该依赖的对象

以上就是Java设计模式七大原则之迪米特法则详解的详细内容,更多关于Java迪米特法则的资料请关注脚本之家其它相关文章!

相关文章

  • java-list创建的两种常见方式

    java-list创建的两种常见方式

    本文给大家分享Java-list创建的两种常见方式,每种方式结合实例代码给大家讲解的非常详细,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • Springboot拦截filter中异常的处理

    Springboot拦截filter中异常的处理

    SpringBoot提供了全局异常处理机制可以拦截所有异常,包括Filter中的异常,本文主要介绍了Springboot拦截filter中异常的处理,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • springboot使用CommandLineRunner解决项目启动时初始化资源的操作

    springboot使用CommandLineRunner解决项目启动时初始化资源的操作

    这篇文章主要介绍了springboot使用CommandLineRunner解决项目启动时初始化资源的操作,帮助大家更好的理解和学习使用springboot框架,感兴趣的朋友可以了解下
    2021-02-02
  • 简单了解spring cloud 网关服务

    简单了解spring cloud 网关服务

    这篇文章主要介绍了简单了解spring cloud 网关服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 解决SpringBoot内嵌Tomcat并发容量的问题

    解决SpringBoot内嵌Tomcat并发容量的问题

    这篇文章主要介绍了解决SpringBoot内嵌Tomcat并发容量的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java知识梳理之泛型用法详解

    Java知识梳理之泛型用法详解

    从JDK 5.0以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型。本文就来和大家深入聊聊Java泛型的使用
    2022-08-08
  • 详解Java中类与对象的关系

    详解Java中类与对象的关系

    这篇文章主要介绍了详解Java中类与对象的关系,类的关键字是class,在Java编程里,类的作用相当于机械师手中的构造图,如果没有构造图,就无法打造武器,同样如果没有类,就无法实例化,需要的朋友可以参考下
    2023-05-05
  • 简单了解java volatile

    简单了解java volatile

    这篇文章主要介绍了了解java volatile,volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。下面我们来一起学习一下吧
    2019-05-05
  • JDK8 HashMap扩容机制分析详解

    JDK8 HashMap扩容机制分析详解

    这篇文章主要为大家介绍了JDK8 HashMap扩容机制分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java中高效的判断数组中某个元素是否存在详解

    Java中高效的判断数组中某个元素是否存在详解

    相信大家在操作Java的时候,经常会要检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow中也是一个非常热门的问题。本文将分析几种常见用法及其时间成本,有需要的朋友们可以参考借鉴。
    2016-11-11

最新评论