迪米特法则(Law of Demeter,LoD)
简介迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及而广为人知。
模型定义
迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及而广为人知。
迪米特法则的定义是:只与你的直接朋友交谈,不跟“陌生人”说话(Talk only to your immediate friends and not to strangers)。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。
模型优缺点
优点:
- 降低了类之间的耦合度,提高了模块的相对独立性
- 由于亲合度降低,从而提高了类的可复用率和系统的扩展性
缺点:
- 过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。所以,在釆用迪米特法则时需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。
模型实现
如果有你、朋友和陌生人三个人需要进行沟通,按照迪米特法则的原则,那么你的类中不要出现陌生人的调用,陌生人中不要存在调用你代码,所以朋友就作为了一个中间量。
package com.company.lawOfDemeter;
public class LawOfDemeter {
public static void main(String[] args) {
Friend friend = new Friend();
friend.setMe(new Me());
friend.setStranger(new Stranger());
friend.play();
}
}
class Me {
public void play() {
System.out.println("我");
}
}
class Friend {
private Me me;
private Stranger stranger;
public void setMe(Me me){
this.me = me;
}
public void setStranger(Stranger stranger){
this.stranger = stranger;
}
public void play(){
this.me.play();
this.stranger.play();
}
}
class Stranger {
public void play() {
System.out.println("陌生人");
}
}
输出结果:
我
陌生人
这样就保持了Me和Stranger类中没有相互的调用,而是都转给了中间者Friend类中去处理。
在使用jetbrains的工具PHPStrom和PyCharm的Git功能,有时候记住了密码,但是当遇到需要切换提交用户的时候我们可以将记住的信息清理掉,这里做一个备注。
Excel如何取最大值、最小值、排名第几的数据,这些都是在我们使用Excel中非常常用的功能。本文主要介绍下这几种函数的使用。
OpenOffice.org 是一套跨平台的办公室软件套件,能在Windows、Linux、MacOS X (X11)和 Solaris 等操作系统上执行。它与各个主要的办公室软件套件兼容。OpenOffice.org 是免费软件,任何人都可以免费下载、使用及推广它。
《曾经的你》是由许巍作词、作曲,由许巍演唱的一首歌曲。收录在专辑《每一刻都是崭新的》中。这首歌是一首流行风格的歌曲。歌曲展现了许巍高超的唱功及创作功力。
通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。
快速生成表格
Electron页面跳转、浏览器打开链接和打开新窗口
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题