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迪米特法则的资料请关注我们其它相关文章!

(0)

相关推荐

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

    定义 一个对象应该对其他对象保持最少的了解. 问题由来 类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案 尽量降低类与类之间的耦合. 自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚.无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率.低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的. 迪米特法则又叫最少知道原则,最早是在1987年由美国Northeastern Un

  • Java的设计模式编程中迪米特法则的应用示例

    定义:一个对象应该对其他对象了解最少 迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用性才可以提高. 形象一点的比喻类似于:监狱内的犯人是不应该跟外面的人接触的,当然或许会有探亲的.这里的监狱就是类,里面的犯人就是类内部的信息,而监狱里的狱警就相当于迪米特法则的执行者 迪米特法则主张: (1)在类的划分上,应该创建有弱耦合的类: (2)在类的结构设计上,每一个类都应当尽量降低成员的访问权限: (3)在类的设计上,只要有可能,一个类应当设计成不变类: (4)在对其他类的引用上,

  • java面向对象设计原则之迪米特法则分析详解

    目录 概念 使用 拓展 概念 迪米特法则解决类与类之间耦合度问题,如果类A调用了B类的某一个方法,则这两个类就形成了一种紧耦合的方式,当B类这个方法发生变化时,一定会影响A类的执行结果.迪米特法则要求每一个类尽可能少的与其他类发生关系,也就是尽可能少的让其他类发生变化时,对其代码的执行结果产生的影响降到最低. 典型情况:A类调用B类的方法,B类和C类是一种关联关系,如果A类通过B类所持有的C类对象直接调用C类的方法,则A类和C类同时拥有强耦合的关系.代码如下: public class B {

  • 迪米特法则_动力节点Java学院整理

    定义:一个对象应该对其他对象保持最少的了解. 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦合. 自从我们接触编程开始,就知道了软件编程的总的原则:低耦合,高内聚.无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量的低,才能提高代码的复用率.低耦合的优点不言而喻,但是怎么样编程才能做到低耦合呢?那正是迪米特法则要去完成的. 迪米特法则又叫最少知道原则,最早是在1987年由美国Northeastern Un

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

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项 目设计提 出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则. 案例 需求 有一个公司,下属有各个部门,现要求打印出公司员工的ID和部门员工的ID 方案一 定义公司员工类 /** * 公司员工 * @author:liyajie * @createTime:2022/2/8 11:

  • java设计模式七大原则之迪米特原则详解

    目录 1.什么是迪米特原则? 2.违反迪米特原则代码案例 3.遵守迪米特原则代码案例 4.迪米特原则的注意事项 1.什么是迪米特原则? 一个对象应该对其他对象保持最少的了解. 类与类关系越密切,耦合度越大. 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好.也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部.对外除了提供的public方法,不对外泄露任何信息. 迪米特法则还有个更简单的定义:只与直接的朋友通信. 直接的朋友:每个

  • Java设计模式七大原则之合成复用原则详解

    目录 定义 案例 需求 方案一 方案二 方案三 对比分析 总结 设计原则的核心思想 定义 合成复用原则(Composite Reuse Principle),即尽量使用组合/聚合的方式,而不是使用继承. 案例 需求 现在假设有一个A类,里面有两个方法,有一个B类,想要复用这两个方法,请问有几种方案 方案一 继承的方式 定义A类,并定义两个方法 /** * 类A * @author:liyajie * @createTime:2022/2/9 9:50 * @version:1.0 */ publ

  • Java设计模式七大原则之单一职责原则详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 如何遵守单一职责原则 定义 单一职责原则(Single Responsibility Principle, SRP),有且仅有一个原因引起类的变更.简单来说,就是针对一个java类,它应该只负责一项职责.例如一个Test.java类,它有两个职责:职责1,职责2.当职责1进行修改时,有可能影响到职责2,所以需要将Test.java类拆分成Test1.java和Test2.java两个单一职责的类. 案例 需求 有一个交通工具类,里面定义一个

  • Java设计模式七大原则之里氏替换原则详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 里氏替换原则(Liskov Substitution Principle,LSP),官方定义如下: 如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象 o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型,所有引用基类的地方必须能透明地使用其子类的对象.则通俗的来讲:子类可以扩展父类的功能,但是子类不能修改父类原有的功能 里氏替换原则就是给继承性的使用制定了规范 案例 需求

  • Java设计模式七大原则之依赖倒置原则详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 依赖倒转原则,又称依赖倒置原则(Dependence Inversion Principle),又称DIP原则,即:上层模块不应该依赖底层模块,它们都应该依赖于抽象,抽象不应该依赖于细节,细节应该依赖于抽象.抽象对代码来说即接口或者抽象类 细节对代码来说即实现类.换句话说 依赖倒转原则的核心的理念 相对于细节来说,抽象要稳定得多.要求我们 面向接口编程,进行设计. 案例 需求 工作人员接收微信老板发来的加班消息 方案一 定义工作人员W

  • Java设计模式七大原则之接口隔离原则详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 小知识点 相同点 不同点 定义 接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为 1.客户端不应该依赖它不需要的接口 2.类间的依赖关系应该建立在最小的接口上 简单点来讲就是在一个类中不要定义过多的方法,接口应该尽量简单细化 案例 需求 假设有这样一个案例场景,现在有一个接口Repair,给定他有三个能力,可以修汽车,修火车,修飞机, 两个实现类张师傅,李师傅分别具有这些能力,有一

  • Java设计模式七大原则之开闭原则详解

    目录 定义 案例 需求 方案一 执行结果 方案二 执行结果 对比分析 总结 定义 开闭原则( Open Close Principle ),又称为OCP原则,即一个软件实体如类,模块和函数应该对扩展开放,对修改关闭.其中,对扩展开放是针对提供方来说的,对修改关闭是针对调用方来说的. 案例 需求 购买东西的时候,根据支付类型的不同使用不同的方式进行支付,当类型为1时,使用微信支付:当类型为2时,使用支付宝支付 方案一 定义支付类型 /** * 支付类型 * @author:liyajie * @c

随机推荐