java 迪米特法则_Java设计模式之迪米特法则
迪米特法则是在一个叫做迪米特的项目中提出来的,它要求一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则。
迪米特法则的意义是降低类之间的耦合,由于每个对象应该尽量减少对其他对象的了解,因此,很容易使得系统的功能模块独立,相互之间不存在或者很少的依赖关系。
那么怎么做到一个对象对其他对象的了解最少呢?我们把对象比作我们自己,要想实现对其他人有更少的了解,做到两点就够了:1. 只和直接的朋友交流;2.减少对朋友的了解。
迪米特法则有一个英文解释:talk only to your immediate friends。每个对象都必然会与其他对象有耦合关系,两个对象之间有耦合,就会成为朋友,而出现在成员变量、方法参数和返回值中的对象就是直接的朋友。
迪米特法则要求只与直接的朋友进行通信。
在方法体内部出现的类就不是直接的朋友,如果一个类不是和直接朋友进行交流,那么就违反了迪米特法则。
下面我们以一个统计学生的例子来对迪米特法则的实际应用进行讲解。
学生类:
class Student {
}
班长类:
class GroupLeader {
public void count(ArrayList students) {
System.out.println(students.size());
}
}
教师类:
class Teacher {
public void command(GroupLeader groupLeader) {
ArrayList students = new ArrayList<>();
for (int i = 0; i < 20; i++) {
students.add(new Student());
}
groupLeader.count(students);
}
}
应用场景:
public static void main(String[] args) {
new Teacher().command(new GroupLeader());
}
分析Teacher类,发现Teacher类总共有GroupLeader和Student两个朋友,GroupLeader是Teacher类方法的参数,因此GroupLeader类是Teacher类的之间朋友,而Student不是Teacher类的直接朋友,且Student类在Teacher类的方法中被使用,因此Teacher违背了迪米特法则只与直接朋友交流的原则。
因此我们需要在Teacher类中移除Student类的使用,可行的方法是将其处理放到GroupLeader类中。
class GroupLeader {
private ArrayList students;
public GroupLeader() {
students = new ArrayList<>();
for (int i = 0; i < 20; i++) {
students.add(new Student());
}
}
public void count() {
System.out.println(students.size());
}
}
其实我们同样可以将students声明为Teacher类的成员变量,但是这样的话,Student类同时与Teacher类与GroupLeader类存在依赖,而迪米特法则要求低耦合,因此将students作为GroupLeader类的成员变量使得Student类只与GroupLeader类存在依赖,与Teacher类不存在依赖。
迪米特法则同样要求减少对朋友的了解。具体的实现方法就是减少一个类对外暴露的方法,在Java语言中具体就是减少Public方法。
下面以咖啡机为例子讲解如何减少对朋友的了解。
咖啡机类:
class CoffeeMachine {
public void addCoffeeBean() {
System.out.println("添加咖啡豆");
}
public void addWater() {
System.out.println("添加水");
}
public void makeCoffee() {
System.out.println("制作咖啡");
}
}
人类:
class Person {
public void makeCoffee(CoffeeMachine coffeeMachine) {
coffeeMachine.addCoffeeBean();
coffeeMachine.addWater();
coffeeMachine.makeCoffee();
}
}
人类关心的事情仅仅是让咖啡机制作咖啡,并不关系咖啡是如何制作的,提供较多的开放方法增加了两个类之间的耦合程度,不利于咖啡机类的扩展,假如我们改进了咖啡机的制作工艺,可以自动地加牛奶,这时候,用户需要修改自己地代码。
修改咖啡机类为仅仅对外暴露一个make方法用于制作咖啡,用户仅仅需要调用这个方法就可以制作咖啡。
public void make() {
addCoffeeBean();
addWater();
makeCoffee();
}
人类:
class Person {
public void makeCoffee(CoffeeMachine coffeeMachine) {
coffeeMachine.make();
}
}
迪米特法则的目的,是把我们的类变成一个个“肥宅”。
迪米特法则的核心观念就是类间解耦,弱耦合。只有弱耦合了之后,类的复用才可以提高,类变更的风险才可以减低。但解耦是有限度的,除非是计算机的最小单元--二进制的0和1,否则都是存在耦合的。所以在实际项目中,需要适度地参考这个原则,避免过犹不及。六大设计原则之五:迪米特法则www.jianshu.com
java 迪米特法则_Java设计模式之迪米特法则相关推荐
- java常用代码解析_Java设计模式常用原则代码解析
本篇文章小编给大家分享一下Java设计模式常用原则代码解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.单一职责原则每一个类负责一个职责(一个类只有 ...
- java中装饰器_Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- java connection 单例_Java设计模式之单例模式详解
Java设计模式之单例模式详解 什么是设计模式 设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可 ...
- java 类的合成_Java设计模式-合成模式
合成模式有时也叫组合模式,对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 "部分/ ...
- java 抽象工厂工厂_Java设计模式之简单工厂、工厂方法和抽象工厂
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:456544752我们一起学Java! 在前面的学习中(参见前面的博客),我们学到了很 ...
- java 工厂模式 计算器_java设计模式之简单工厂模式
在编写一个计算器程序时,可以将业务逻辑和显示分离,业务逻辑封装为一个类(封装):如果要新添加一种运算,可以先创建一个Operation的基类,然后各种运算从Operation类继承,并实现GetRes ...
- java 状态模式 同步_JAVA设计模式之状态模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...
- Java行业情景分析_Java 设计模式情景分析——单例模式
单例模式可以说是应用最广的模式之一,在应用单例模式时,单例对象的类必须保证只有一个实例存在,而且可以自行实例化并向整个系统提供这个实例.一般在不能自由构造对象的情况下,就会使用单例设计模式,例如创建一 ...
- java的visitor模式_java设计模式(二十一)访问者模式(Visitor)
介绍 访问者模式(Visitor Pattern):表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式是一种对象行为型模式. 简单来 ...
最新文章
- 浅谈视觉设计的准确性
- [Hive]-函数篇
- Linux 小知识翻译 - 「/proc 文件夹」
- Gmail地址图片注册...
- Go基础编程:Socket编程
- 苹果双系统怎么切换_华为双系统,你会用吗?实在太神了!一键开启,一台手机当两台用...
- 【算法】07 AM-MCMC算法C++实现
- 小公司程序员怎么进大公司
- 串口异步通信——时序宽度测试
- Cisco Packet Tracer Student 两个路由器级联
- java.util.LinkedHashMap cannot be cast to 问题
- 回环口--Loopback接口
- 鸡兔同笼,有35个头,94只脚,求鸡兔各几只
- ubuntu下qt模拟键盘按键按下_基于QT的跨平台虚拟键盘设计与实现
- C++之路进阶——codevs2313(星际竞速)
- 分钟转换为小时加分钟方法
- 如何解决VC2019中:error C3861: “xxxx”: 找不到标识符
- html5 canvas获取坐标系,HTML5 Canvas球坐标系投影到二维直角坐标系实例演示
- 动态图片怎么压缩?如何在线压缩gif动图大小?
- 大学c语言程序上机考试试题,C语言上机考试试题练习(2)
热门文章
- DIY作品 | LED矩阵电子沙漏
- 计算机毕业设计之java+ssm医院资产管理系统
- 如何理解Q、K、V,Self-attention + Multi-head Self-attention
- 基于51单片机的数码时钟
- js中的WebSocket
- ps制作鲨鱼在橙子“海洋”里游泳的创意画面
- 基于JavaWeb+MySQL的企业员工信息管理系统(考勤、工资、岗位、奖惩等)
- 电路仿真软件详谈(27),基于电路仿真软件proteus的实时时钟仿真
- 某手安卓自动刷视频分析
- Netflix Archaius 分布式配置管理依赖构件