• Java设计模式七大原则-迪米特法则


    目录

    迪米特法则

    基本介绍

    迪米特法则注意事项和细节


    迪米特法则

    基本介绍

    1. 一个对象应该对其他对象保持最少的了解
    2. 类与类关系越密切,耦合度越大
    3. 迪米特法则(Demeter Principle)又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的public 方法,不对外泄露任何信息
    4. 迪米特法则还有个更简单的定义:只与直接的朋友通信
    5. 直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象之间有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

    例子

    有一个学校,下属有各个学院和总部,现要求打印出学校总部员工ID和学院员工的id

    1. package com.atguigu.demeter;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class Demeter1 {
    5. public static void main(String[] args) {
    6. // TODO Auto-generated method stub
    7. //创建 SchoolManager 对象
    8. SchoolManager schoolManager = new SchoolManager();
    9. //输出学院员工 和 学校总员工 的id
    10. schoolManager.printAllEmployee(new CollegeManager());
    11. }
    12. }
    13. class Employee {
    14. private String id;
    15. public void setId(String id) {
    16. this.id = id;
    17. }
    18. public String getId() {
    19. return id;
    20. }
    21. }
    22. class CollegeEmployee {
    23. private String id;
    24. public void setId(String id) {
    25. this.id = id;
    26. }
    27. public String getId() {
    28. return id;
    29. }
    30. }
    31. //管理学院员工的管理类
    32. class CollegeManager {
    33. public List getAllEmployee() {
    34. List list = new ArrayList();
    35. for (int i = 0; i < 10; i++) {
    36. CollegeEmployee emp = new CollegeEmployee();
    37. emp.setId("学院员工= " + i);
    38. list.add(emp);
    39. }
    40. return list;
    41. }
    42. }
    43. //学校管理类
    44. /*
    45. * SchoolManager直接朋友:Employee、CollegeManager
    46. * 非直接朋友(违反迪米特法则):CollegeEmployee
    47. */
    48. class SchoolManager {
    49. //返回学校总部的员工
    50. public List getAllEmployee() {
    51. List list = new ArrayList();
    52. for (int i = 0; i < 5; i++) {
    53. Employee emp = new Employee();
    54. emp.setId("学校总部员工id= " + i);
    55. list.add(emp);
    56. }
    57. return list;
    58. }
    59. //该方法完成输出学校总部和学院员工的信息
    60. void printAllEmployee(CollegeManager sub) {
    61. //分析问题
    62. //1。这里的 CollegeEmployee 不是 SchoolManager的直接朋友
    63. //2。CollegeEmployee 是以局部变量方式出现在 SchoolManager
    64. //3,违反了 迪米特法则
    65. List list1 = sub.getAllEmployee();
    66. System.out.println("------------分公司员工------------");
    67. for (CollegeEmployee e : list1) {
    68. System.out.println(e.getId());
    69. }
    70. List list2 = this.getAllEmployee();
    71. System.out.println("------------学校总部员工------------");
    72. for (Employee e : list2) {
    73. System.out.println(e.getId());
    74. }
    75. }
    76. }

    分析

    应用实例改进
    • 前面设计的问题在于SchoolManager中,CollegeEmployee类并不是SchoolManager类的直接朋友 (分析)
    • 按照迪米特法则,应该避免类中出现这样非直接朋友关系的耦合

    例子改进

    1. //管理学院员工的管理类
    2. class CollegeManager {
    3. public List getAllEmployee() {
    4. List list = new ArrayList();
    5. for (int i = 0; i < 10; i++) {
    6. CollegeEmployee emp = new CollegeEmployee();
    7. emp.setId("学院员工= " + i);
    8. list.add(emp);
    9. }
    10. return list;
    11. }
    12. public void print() {
    13. List list1 = this.getAllEmployee();
    14. System.out.println("------------分公司员工------------");
    15. for (CollegeEmployee e : list1) {
    16. System.out.println(e.getId());
    17. }
    18. }
    19. }
    20. //学校管理类
    21. /*
    22. * SchoolManager直接朋友:Employee、CollegeManager
    23. * 非直接朋友(违反迪米特法则):CollegeEmployee
    24. */
    25. class SchoolManager {
    26. //返回学校总部的员工
    27. public List getAllEmployee() {
    28. List list = new ArrayList();
    29. for (int i = 0; i < 5; i++) {
    30. Employee emp = new Employee();
    31. emp.setId("学校总部员工id= " + i);
    32. list.add(emp);
    33. }
    34. return list;
    35. }
    36. //该方法完成输出学校总部和学院员工的信息
    37. void printAllEmployee(CollegeManager sub) {
    38. //解决方法
    39. //将获取员工id放到CollegeEmployee类中,调用方法即可
    40. sub.print();
    41. List list2 = this.getAllEmployee();
    42. System.out.println("------------学校总部员工------------");
    43. for (Employee e : list2) {
    44. System.out.println(e.getId());
    45. }
    46. }
    47. }

    迪米特法则注意事项和细节

    1) 迪米特法则的核心是 降低类之间的耦合
    2) 但是注意:由于每个类都减少了不必要的依赖,因此迪米特法则只是要求降低
    类间 ( 对象间 ) 耦合关系, 并不是要求完全没有依赖关系
  • 相关阅读:
    渗透测试之分享常用工具、插件和脚本(干货)
    比React—Redux和Redux好用100倍的原子级状态管理器,是我们公司自己封装的npm包,如果感兴趣可以研究研究,会大大提高开发效率
    2019 LCLR | How Powerful are Graph Neural Networks
    电脑怎么录制视频,录制的视频怎么剪辑?
    不要只成为PID调参工程师
    java高级--SpringBoot篇
    BP神经网络中s函数的作用,bp神经网络的目标函数
    设计模式—结构型模式之外观模式(门面模式)
    python 跨文件的全局变量修改
    关于开发环境搭建
  • 原文地址:https://blog.csdn.net/m0_62946761/article/details/128156040