当前位置: 首页 > ds >正文

设计模式-设计原则-迪米特法则(最小知识原则)

迪米特法则(最小知识原则)

概念

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

特点

直接的朋友

  • 每个对象都会与其他对象有耦合关系
  • 只要两个对象之间有耦合关系我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等
  • 其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友
  • 而出现在局部变量中的类不是直接的朋友
  • 即在类中突然使用了 new 类的操作
  • 也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。

场景介绍

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

在这里插入图片描述

违反–迪米特法则

​ 下列的代码中CollegeEmployee不是 方法形参、方法返回值、成员变量 所以不是类SchoolManager的直接朋友 违反迪米特法则应作出优化

public class Demeter {//客户端public static void main(String[] args) {SchoolManager schoolManager = new SchoolManager();schoolManager.printAllEmployee(new CollegeManager());}
}//雇员  学校总部员工
class Employee{private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}
}//学院的员工
class CollegeEmployee{private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}
}//管理学院员工的管理类
class CollegeManager{public List<CollegeEmployee> getAllEmployee(){ArrayList<CollegeEmployee> list = new ArrayList<>();for (int i = 0;i<10;i++){CollegeEmployee collegeEmployee = new CollegeEmployee();collegeEmployee.setId("学院员工id = "+ i);list.add(collegeEmployee);}return list;}
}//管理学校的管理类
class SchoolManager{public List<Employee> getAllEmployee(){ArrayList<Employee> list = new ArrayList<>();for (int i = 0;i<10;i++){Employee employee = new Employee();employee.setId("学校总部员工id = "+i);list.add(employee);}return list;}//打印所有员工void printAllEmployee(CollegeManager sub){//该处的CollegeEmployee变量并不是 成员变量、方法形参、方法返回值//所以为非直接朋友关系//需要进行优化List<CollegeEmployee> list1 = sub.getAllEmployee();System.out.println("---分公司员工---");for (CollegeEmployee collegeEmployee : list1) {System.out.println(collegeEmployee.getId());}List<Employee> list2 = this.getAllEmployee();System.out.println("---学校总部员工---");for (Employee employee : list2) {System.out.println(employee.getId());}}}

运行结果

在这里插入图片描述


遵循–迪米特法则

​ 取出员工List并遍历输出的功能应该由类CollegeManager自己完成并提供对外暴露的public方法(封装方法

public class Demeter {//客户端public static void main(String[] args) {System.out.println("---修改后,遵循迪米特法则---");SchoolManager schoolManager = new SchoolManager();schoolManager.printAllEmployee(new CollegeManager());}
}//雇员  学校总部员工
class Employee{private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}
}//学院的员工
class CollegeEmployee{private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}
}//管理学院员工的管理类
class CollegeManager{public List<CollegeEmployee> getAllEmployee(){ArrayList<CollegeEmployee> list = new ArrayList<>();for (int i = 0;i<10;i++){CollegeEmployee collegeEmployee = new CollegeEmployee();collegeEmployee.setId("学院员工id = "+ i);list.add(collegeEmployee);}return list;}public void printAllEmployee(){List<CollegeEmployee> list1 = this.getAllEmployee();System.out.println("---分公司员工---");for (CollegeEmployee collegeEmployee : list1) {System.out.println(collegeEmployee.getId());}}
}//管理学校的管理类
class SchoolManager{public List<Employee> getAllEmployee(){ArrayList<Employee> list = new ArrayList<>();for (int i = 0;i<10;i++){Employee employee = new Employee();employee.setId("学校总部员工id = "+i);list.add(employee);}return list;}//打印所有员工void printAllEmployee(CollegeManager sub){//将输出学院的员工方法;封装到CollegeManagersub.printAllEmployee();List<Employee> list2 = this.getAllEmployee();System.out.println("---学校总部员工---");for (Employee employee : list2) {System.out.println(employee.getId());}}}

运行结果
在这里插入图片描述


注意实现及细节

  1. 核心:降低耦合
  2. 只是要求降低类间的耦合,并不是完全没有依赖关系
http://www.xdnf.cn/news/11594.html

相关文章:

  • 二值神经网络(Binary Neural Network,BNN)
  • Q44F-16C型号字母含义
  • Axis2中文手册
  • Wireshark零基础使用教程(超详细)
  • AC-DC工作原理以及 PCB设计要点
  • JS页面刷新:location.reload和location.replace区别
  • ArcGIS教程——ArcGIS快速入门
  • HDU7321-KongMingQi孔明棋(找规律)
  • SetTimer和KillTimer函数简介
  • 【网络安全】简单的免杀方法(非常详细)零基础入门到精通,收藏这一篇就够了_免杀加壳工具
  • 收藏的 让你明白response.sendRedirect()与request.getRequestDispatcher
  • 一次对asp+fck的简单渗透
  • 瀑布流布局 (初版)
  • Windows7系统rdpclip.exe文件丢失问题
  • android原生开发教程,安卓开发入门到精通
  • 【转】Qt4移植Qt5总结
  • 编译,移植DDWRT到到belkin8230
  • 自学编程的六种方法,你必须知道
  • Windows下安装UCenter和UCenter_Home
  • 【收藏】The top 200 sites on the web
  • FPGA驱动HDMI————基于达芬奇开发板
  • oracle的常用函数
  • LED灯珠的封装形式
  • XDC约束技巧——时钟篇【XDC其基础语法来源于业界统一的约束规范SDC】
  • Java线程池ThreadPoolExecutor详细介绍与使用
  • 使用html+css+js实现一个静态页面(含源码)
  • Resultset获取数据
  • Linpack的安装
  • LaTex实战笔记 4-字体格式
  • TOPSIS法