博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式值六大原则——迪米特法则(LoD)也称为最少知识原则(LKP)。
阅读量:6171 次
发布时间:2019-06-21

本文共 1629 字,大约阅读时间需要 5 分钟。

定义:

迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least Knowledge Principle,LKP)。

一个对象应该对其他对象有最少的了解。通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的public方法,我就调用这么多,其他的一概不关心。

 

含义:

  • 只和朋友交流

朋友类的定义是这样的:出现在成员变量、方法的输入输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类。

 

下面的代码在方法体内部依赖了其他类,这严重违反迪米特法则

1
2
3
4
5
6
7
8
9
10
11
12
13
public
class
Teacher {
 
    
public
void
commond(GroupLeader groupLeader) {
        
List<Girl> listGirls =
new
ArrayList<Girl>();
 
        
for
(
int
i =
0
; i <
20
; i++) {
            
listGirls.add(
new
Girl());
        
}
 
        
groupLeader.countGirls(listGirls);
    
}
 
}

 

方法是类的一个行为,类竟然不知道自己的行为与其他类产生了依赖关系,这是不允许的。

正确的做法是:

1
2
3
4
5
6
7
public
class
Teacher {
 
    
public
void
commond(GroupLeader groupLeader) {
        
groupLeader.countGirls();
    
}
 
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public
class
GroupLeader {
 
    
private
List<Girl> listGirls;
 
    
public
GroupLeader(List<Girl> _listGirls) {
        
this
.listGirls = _listGirls;
    
}
 
    
public
void
countGirls() {
        
System.out.println(
"女生数量是:"
+ listGirls.size());
    
}
 
}

注意:一个类只和朋友交流,不与陌生类交流,不要出现getA().getB().getC().getD()这种情况(在一种极端情况下允许出现 这种访问,即每一个点号后面的返回类型都相同),类与类之间的关系是建立在类间的,而不是方法间,因此一个方法尽量不引入一个类中不存在的对象,当 然,JDK API提供的类除外。

  • 朋友间也是有距离的

一个类公开的public属性或方法越多,修改时涉及的面也就越大,变更引起的风险扩散也就越大。因此,为了保持朋友类间的距离,在设计时需要反复 衡量:是否还可以再减少public方法和属性,是否可以修改为private、package-private(包类型,在类、方法、变量前不加访问权 限,则默认为包类型)、protected等访问权限,是否可以加上final关键字等。

注意:迪米特法则要求类“羞涩”一点,尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多使用private、package-private、protected等访问权限。

 

  • 是自己的就是自己的

如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,就放置在本类中。

 

  • 谨慎使用Serializable

 

最后,迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用率才可以提高。

 

源自:http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793000.html

转载于:https://www.cnblogs.com/jiandankuaile/p/4533030.html

你可能感兴趣的文章
Opera已确认解散iOS开发团队
查看>>
DevOps:新的业务浪潮
查看>>
CERT:启用EMET的Windows 7比Windows 10更加安全
查看>>
LINE上市:一场迟到、勇敢又无奈的IPO
查看>>
OA选型:OA系统工作流是核心
查看>>
如何发现“利用DNS放大攻击”的服务器
查看>>
《Arduino开发实战指南:LabVIEW卷》——第2章 Arduino软件
查看>>
京津冀大数据走廊起笔谋篇
查看>>
WIFI连网一“吻”通 黑科技让无线路由器更智能
查看>>
Ovum光器件首席分析师:硅光子不是唯一解决方案
查看>>
大数据发展进入快车道 未来会呈现高速增长
查看>>
JVM基础:JVM内存组成及分配
查看>>
数据库锁和数据库隔离级别
查看>>
Linux下的内核测试工具——perf使用简介
查看>>
《从问题到程序:用Python学编程和计算》——2.3 内置函数和数学函数包
查看>>
《Photoshop修饰与合成专业技法》目录—导读
查看>>
《Metasploit渗透测试手册》—第1章1.10节分析数据库中存储的渗透测试结果
查看>>
《Adobe Acrobat XI经典教程》—第2课减小文件大小
查看>>
《数据库技术原理与应用教程》一第2章 数据库的基础知识
查看>>
QuaggaJS —— 纯 JavaScript 开发的条形码扫描
查看>>