java设计模式--迪米特法则
基本介绍
1、一个对象应该对其他对象保持最少的了解
2、类与类关系越密切,耦合度越大
3、迪米特法则又叫最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类不管多么复杂,都尽量将逻辑封装在类的内部。对外除了提供public方法,不对外泄露任何信息
4、迪米特法则还有个更简单的定义:只与直接朋友通信
5、直接的朋友:每个对象都会与其他对象有耦合关系,只要两个对象只有有耦合关系,我们就说这两个对象之间是朋友关系。耦合的方式很多,依赖,关联,组合,聚合等。其中,我们称出现成员变量,方法参数,方法返回值中的类为直接的朋友,而出现在局部变量中的类不是直接的朋友。也就是说,陌生的类最好不要以局部变量的形式出现在类的内部。
案例分析
public class Demeter1 {
public static void main(String[] args) {
SchoolManager schoolManager = new SchoolManager();
schoolManager.printAllEmployee(new CollegeManage());
}
}
//总部员工的类
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 CollegeManage {
// 返回学院的所有员工
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id" + i);
list.add(emp);
}
return list;
}
// 输出学院员工的信息
public void printEmployee() {
// 获取学院员工
List<CollegeEmployee> list1 = this.getAllEmployee();
System.out.println("------学院员工------");
for (CollegeEmployee e : list1) {
System.out.println(e.getId());
}
}
}
//管理学校员工的类
class SchoolManager {
// 返回学校总部的所有员工
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
Employee emp = new Employee();
emp.setId("学校总部员工" + i);
list.add(emp);
}
return list;
}
void printAllEmployee(CollegeManage sub) {
/*
* 分析问题 1.这里的CollegeEmployee 不是 SchoolManager的直接朋友 2.CollegeEmployee
* 是以局部变量的方式出现在 SchoolManager 3.违反了迪米特法则
*/
/*
* 解决办法 1.将输出学院的员工方法,转到CollegeEmployee
*/
sub.printEmployee();
// 获取学校总部员工
List<Employee> list2 = this.getAllEmployee();
System.out.println("------学校总部员工------");
for (Employee e : list2) {
System.out.println(e.getId());
}
}
}
上面的代码,CollegeEmployee 不是 SchoolManager的直接朋友,CollegeEmployee是以局部变量的方式出现在SchoolManager,所以违反了迪米特法则
改进代码
public class Demeter1 {
public static void main(String[] args) {
SchoolManager schoolManager = new SchoolManager();
schoolManager.printAllEmployee(new CollegeManage());
}
}
//总部员工的类
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 CollegeManage {
// 返回学院的所有员工
public List<CollegeEmployee> getAllEmployee() {
List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
for (int i = 0; i < 10; i++) {
CollegeEmployee emp = new CollegeEmployee();
emp.setId("学院员工id" + i);
list.add(emp);
}
return list;
}
}
//管理学校员工的类
class SchoolManager {
// 返回学校总部的所有员工
public List<Employee> getAllEmployee() {
List<Employee> list = new ArrayList<Employee>();
for (int i = 0; i < 5; i++) {
Employee emp = new Employee();
emp.setId("学校总部员工" + i);
list.add(emp);
}
return list;
}
void printAllEmployee(CollegeManage sub) {
// 获取学院员工
List<CollegeEmployee> list1 = sub.getAllEmployee();
System.out.println("------学院员工------");
for (CollegeEmployee e : list1) {
System.out.println(e.getId());
}
// 获取学校总部员工
List<Employee> list2 = this.getAllEmployee();
System.out.println("------学校总部员工------");
for (Employee e : list2) {
System.out.println(e.getId());
}
}
}
迪米特法则应注意的事项和细节
1、迪米特法则的核心是降低类之间的耦合
2、由于每个类都减少了不必要的依赖,因此迪米特法则知识要求降低类间(对象间)耦合关系,并不是要求完全没有依赖关系
java设计模式--迪米特法则的更多相关文章
- 设计模式--迪米特法则(Lod/LKP)
迪米特法则:(Law of Demeter, LoD),也称最少知识原则(Least Knowledge Principle, LKP) 理解: 假设两个类不必彼此直接通信,那么这两个类就不 ...
- Java设计模式(3:接口隔离原则和迪米特法则详解)
一.接口隔离原则 使用多个接口,而不使用单一的接口,客户端不应该依赖它不需要的接口.尽量的细化接口的职责,降低类的耦合度. 我们先来看一个例子: 小明家附近新开了一家动物园,里面有老虎.鸟儿.长颈鹿. ...
- 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)
一,总体概要 1,笔者浅谈 说起“门面”这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, function Employee(n ...
- 设计模式六大原则——迪米特法则(LoD)
1.背景 在图书馆借书.刚開始的时候,直接跑到对应的楼层去,到里面去转,去找要借的书,在里面溜达半天才干找到:后来知道图书馆有一个电脑查询处.然后直接在电脑上输入想要借的书,电脑就会显示你想要借的书的 ...
- 设计模式之模板方法模式&&迪米特法则(代码Objective-C展示)
模板方法模式 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变一个算法的结构即可重定义该算法的某些特定步骤. 比如说,小时候数学老师的随堂检测,都是在黑板 ...
- 《设计模式》-原则六:迪米特法则(LoD)
啊哈哈哈哈,又到星期五了,真开心.回来吃完饭慌着去玩游戏,所以立马过来先完成今天的学习目标. 这个原则的命名好像是以某个人的名字命名的,算了我不去管这个了. 直接说说我学到的东西,这个迪米特法则又可以 ...
- ZT 设计模式六大原则(5):迪米特法则
转贴: 设计模式六大原则(5):迪米特法则 原帖子的后续评论里面很多值得仔细去看 切记!像21楼 21楼 chenshufei2 2012-09-23 12:47发表 [回复] 上个例子,就是方法 ...
- IOS设计模式的六大设计原则之迪米特法则(LOD,Law Of Demeter)
定义 狭义的迪米特法则定义:也叫最少知识原则(LKP,Least Knowledge Principle).如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中的一个类需要调用 ...
- 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式
1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...
随机推荐
- Kettle自定义jar包供javascript使用
我们都知道 Kettle 是用 Java 语言开发,并且可以在 JavaScript 里面直接调用 java 类方法.所以有些时候,我们可以自定义一些方法,来供 JavaScript 使用. 本篇文章 ...
- springboot中使用logback
原文地址:https://blog.csdn.net/tianyaleixiaowu/article/details/73321610 Springboot默认集成的就是logback,logback ...
- 靶机-SickOs 1.2 Walkthrough
SickOs:1.2 https://www.vulnhub.com/entry/sickos-12,144/ 参考:https://www.cnblogs.com/yuzly/p/10854392. ...
- 用CSS实现横向滚动条
在进行app制作时,需要使用横向滚动条是内容展示更完善 首先,这是html代码: 这是CSS代码: 要点: 设置显示内容的宽 white-space是防止内容自动折行 overflow-y设置为hid ...
- mysql安装教程linux
https://www.cnblogs.com/YangshengQuan/p/8431520.html 设置sql远程访问
- CTF--HTTP服务--PUT上传漏洞
开门见山 1. 扫描靶机ip,发现PCS 192.168.31.48 2. 用nmap扫描靶机的开放服务和版本信息 3. 再扫描全部信息 4. 用nikto探测靶机http服务敏感信息 5. 再用di ...
- oracle问题之死锁 (一)
[前言] 遇到 oracle 异常 和 解决实践 系列文章 整理分享 杂症一.oracle死锁 一.症状: 执行SQL或程序时,程序没有响应或SQL执行一直处于执行状态,没有成功,也没有报错. 二.病 ...
- Android小记(整理一下自己犯过的错误)
时间:2019/12/20 如题,写这篇博客的原因主要是为了记录自己在Android编程中犯的一些低级的错误,以此警戒自己不要出现类似的错误. 1.在监听按钮的点击事件时,如果使用的是实现View.O ...
- ubuntu系统下安装pip3及第三方库的安装
ubuntu系统下会自带python2.x和python3.x坏境,不需要我们去安装.并且ubuntu系统下还会自动帮助我们安装python2.x坏境下的pip安装工具, 但是没有python3.x坏 ...
- 🔥SpringBoot图文教程2—日志的使用「logback」「log4j」
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...