迪米特法则

  • 一 官方定义
    • 基本介绍
  • 二 案例演示
    • 普通实现方式
      • 案例分析
    • 迪米特法则方式
  • 三 注意事项

一 官方定义

迪米特法则(Law of Demeter, LoD)是1987年秋天由lan holland在美国东北大学一个叫做迪米特的项目设计提出的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则(Least KnowledgePrinciple, LKP)
One object should have a minimum understanding of other objects
(一个对象应该对其他对象有最少的了解 )
Only talk to your immediate friends ( 只与直接的朋友通信)

基本介绍

什么是一个对象应该对其他对象有最少的了解?

换句话说,对于被依赖的类,不管多么复杂都应该将逻辑封装在类的内部,对外只提供公共的public方法,不对外泄露任何其他的信息。

什么是只与直接的朋友通信?
朋友关系: 只要两个对象有依赖关系那他们两个就是朋友关系

直接的朋友:

  • 成员变量

也就是说一个类以成员变量的形式出现在另一个类内部的那么这两个类互为直接的朋友

  • 方法的参数类型

也就是说一个类的方法接收的参数类型是另一个类的类型那么这两个类互为直接的朋友

  • 方法的返回值类型

也就是说一个方法中接收的返回值类型是另一个类的类型那么这两个类互为直接的朋友

比如说在方法内部使用到的,比如说这个类以局部变量的形式出现的,这种情况下他们就不是直接的朋友关系。

二 案例演示

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

普通实现方式

SchoolEmployee 总部员工的基类

//总部员工的基类
public class SchoolEmployee {private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}
}

CollegeEmployee 学院员工的基类

//学院员工的基类
public class CollegeEmployee {private String id;public String getId() {return id;}public void setId(String id) {this.id = id;}
}

SchoolManager 总部管理类


import java.util.ArrayList;
import java.util.List;
//总部管理类
public class SchoolManager {//获取总部员工的方法public List<SchoolEmployee> getSchoolEmployee() {ArrayList<SchoolEmployee> schoolEmployees = new ArrayList<>();for (int i = 0; i < 5; i++) {SchoolEmployee schoolEmployee = new SchoolEmployee();schoolEmployee.setId("总部员工 ,id是" + i);schoolEmployees.add(schoolEmployee);}return schoolEmployees;}//打印方法public void printAllEmployee(CollegeManager collegeManager) {//打印总部的学院员工List<SchoolEmployee> schoolEmployee = this.getSchoolEmployee();for (SchoolEmployee employee : schoolEmployee) {System.out.println(employee.getId());}System.out.println("------------------");//打印学院员工的操作List<CollegeEmployee> collegeEmployee = collegeManager.getCollegeEmployee();for (CollegeEmployee employee : collegeEmployee) {System.out.println(employee.getId());}}
}

CollegeManager 学院的管理类


import java.util.ArrayList;
import java.util.List;//学院的管理类
//提供一个获取学院员工的方法
public class CollegeManager {public List<CollegeEmployee> getCollegeEmployee(){ArrayList<CollegeEmployee> collegeEmployees = new ArrayList<>();for (int i = 0; i < 10; i++) {CollegeEmployee collegeEmployee = new CollegeEmployee();collegeEmployee.setId("学院员工,id是" + i);collegeEmployees.add(collegeEmployee);}return collegeEmployees;}}
//案例演示 - 迪米特法则//客户端的角色
//需求:有一个学校,下属有各个学院和总部,现要求打印出总部员工的ID和学院员工的ID
public class DemeterDemo {public static void main(String[] args) {new SchoolManager().printAllEmployee(new CollegeManager());}
}

案例分析

迪米特法则说道只与直接的朋友通信。
我们分析一下SchoolManager总部管理类。

迪米特法则方式


SchoolManager 总部管理类


public class SchoolManager {//获取总部员工的方法public List<SchoolEmployee> getSchoolEmployee(){ArrayList<SchoolEmployee> schoolEmployees = new ArrayList<>();for (int i = 0; i < 5; i++) {SchoolEmployee schoolEmployee = new SchoolEmployee();schoolEmployee.setId("总部员工 ,id是" + i);schoolEmployees.add(schoolEmployee);}return schoolEmployees;}//打印方法public void printAllEmployee(CollegeManager collegeManager){//打印总部的学院员工List<SchoolEmployee> schoolEmployee = this.getSchoolEmployee();for (SchoolEmployee employee : schoolEmployee) {System.out.println(employee.getId());}System.out.println("------------------");//打印学院员工的操作collegeManager.printCollegeEmployee();}
}

CollegeManager 学院的管理类

//学院的管理类
//提供一个获取学院员工的方法
public class CollegeManager {public List<CollegeEmployee> getCollegeEmployee(){ArrayList<CollegeEmployee> collegeEmployees = new ArrayList<>();for (int i = 0; i < 10; i++) {CollegeEmployee collegeEmployee = new CollegeEmployee();collegeEmployee.setId("学院员工,id是" + i);collegeEmployees.add(collegeEmployee);}return collegeEmployees;}//打印学院员工的方法public void printCollegeEmployee(){List<CollegeEmployee> collegeEmployee = getCollegeEmployee();for (CollegeEmployee employee : collegeEmployee) {System.out.println(employee.getId());}}
}

三 注意事项

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

设计模式原则 - 迪米特法则(六)相关推荐

  1. 六大设计模式原则-迪米特法则

    一.迪米特法则定义 迪米特法则又最少知识原则,其定义如下: 迪米特法则(Law of Demeter, LoD):一个软件实体应当尽可能少的与其他实体发生相互作用. 二.迪米特法则描述 如果一个系统满 ...

  2. 面向对象设计模式原则-迪米特法则

    迪米特法则(LOD,Law of Demeter) 注:迪米特法则又名 :最少知识原则 定义:一个软件实体应当尽可能少地与其他实体发生相互作用. 一个对象应当对其他对象尽可能少的了解,从而降低各个对象 ...

  3. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  4. 面向对象六大原则——迪米特法则

    什么是迪米特法则(Law of Demeter, LoD)  迪米特法则也可以称为最少知识法则(Least Knowledge Principle, LKP).它们都描述了一个规则:一个对象应该对其他 ...

  5. java 迪米特_Java设计原则—迪米特法则(转)

    定义: 迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP). 一个对象应该对其他对象有最少的了解.通俗地讲,一个类应该对 ...

  6. 设计模式:KISS、YAGNI、DRY 原则,迪米特法则(LOD)

    如何理解"KISS 原则"? KISS 原则的英文描述有好几个版本,比如下面这几个. Keep It Simple and Stupid. Keep It Short and Si ...

  7. 设计模式六大原则——迪米特法则(LoD)

    1.背景 在图书馆借书.刚開始的时候,直接跑到对应的楼层去,到里面去转,去找要借的书,在里面溜达半天才干找到:后来知道图书馆有一个电脑查询处.然后直接在电脑上输入想要借的书,电脑就会显示你想要借的书的 ...

  8. 【设计模式】迪米特法则和六种原则的总结

    迪米特法则 一个对象应该对其他对象保持最少的了解 类与类关系越密切,耦合度越大 迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好.也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装 ...

  9. 围观设计模式(5)--迪米特法则(Lod,Law of Demeter)或最少知道原则(Least Knowledge Principle)

    得墨忒耳(迪米特)定律(Law of Demeter,缩写LoD)亦称为"最少知识原则(Principle of Least Knowledge)",是一种软件开发的设计指导原则, ...

最新文章

  1. [译] iOS 开发之新版 APNs 搭建必备知识
  2. imdb导mysql_keras如何导入本地下载的imdb数据集?
  3. Linux-0.00 代码解析(四)
  4. .NET 6 Preview 2 发布
  5. F Christmas Game
  6. 图的深度优先遍历+图解
  7. nodejs,express链式反应
  8. 重排列得到2的幂(51Nod-2515)
  9. java http 包_java http请求
  10. java layoutinflater_使用LayoutInflater动态加载布局和操作控件
  11. Jmeter 快速入门教程(三-1) --添加响应断言(即loadrunner中所指的检查点)
  12. Qt5官方demo分析集10——Qt Quick Particles Examples - Emitters
  13. 智能情绪分析技术_高新技术改造传统企业,智能化解决粘度分析行业
  14. tcp协议及工作原理浅析_详解TCP/IP网络协议栈底层原理到徒手实现
  15. 基于java软件工程专业教辅平台课程子系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  16. 51智能小车前进后退左右旋转
  17. 如何构稳健的商品期cry组合
  18. 宏基因组分析步骤Linux,宏基因组分析专题研讨班
  19. unicode和字符串之间的转换有两种方式
  20. 【协议森林】IPv6过渡技术之MAP-T/E技术

热门文章

  1. 搜索引擎免费登录入口
  2. 深入理解PHP之strpos
  3. 一个未知的项目被声明为你的MXML文件的根。切换到源代码模式加以纠正。
  4. C#的System.Diagnostics.Trace.WriteLine 写入文件
  5. Deqin- 升级版测手速游戏
  6. 《STM32单片机开发应用教程(HAL库版)---基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第二章 软件安装与使用
  7. Marple表演电影字幕
  8. springmvc 升级到5.2.15版本,前台时间显示时间戳全局处理
  9. Hudson之——持续集成服务器的安装与配置
  10. C - 开门人和关门人(结构体+sort)