设计原则之六——迪米特法则

在这里插入图片描述

以下七种设计原则是软件设计模式尽量遵循的原则,各种原则要求的侧重点不同。

开闭原则 是总纲,它告诉我们要对扩展开放,对修改关闭;
里氏替换原则 告诉我们不要破坏继承体系;
依赖倒置原则 告诉我们要面向接口编程;
单一职责原则 告诉我们实现类要职责单一;
接口隔离原则 告诉我们在设计接口的时候要精简单一;
迪米特法则 告诉我们要降低耦合度;
合成复用原则 告诉我们要优先使用组合或者聚合关系复用,少用继承关系复用。


迪米特法则(Law of Demeter,LoD)

一个对象应该对其他对象保持尽可能少的了解。
又叫做 最少知识原则(Least Knowledge Principle,LKP)
The dependency of one class to another one should depend on the smallest possible interface.


  • 只与你的直接朋友交谈,不跟“陌生人”说话。
  • 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发调用。
  • 其目的是降低类之间的耦合度,提高模块的相对独立性。

迪米特法则中的 “朋友” 是指:

  • 当前对象本身
  • 当前对象的成员对象
  • 当前对象所创建的对象
  • 当前对象的方法参数

这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法。


迪米特法则的优点

迪米特法则要求限制软件实体之间通信的宽度和深度,正确使用迪米特法则将有以下两个优点。
① 降低了类之间的耦合度,提高了模块的相对独立性。
② 由于亲和度降低,从而提高了类的可复用性和系统的扩展性。
但是,过度使用迪米特法则会使系统产生大量的中介类,从而增加系统的复杂性,使模块之间的通信效率降低。
所以,在使用迪米特法则时,需要反复权衡,确保高内聚和低耦合的同时,保证系统的结构清晰。


场景举例·壹 明星与经纪人

分析:明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如与粉丝的见面会,与媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则。
其类图如下:

明星与经纪人


场景举例·贰 老子使民无知

《老子》第三章曰:“是以圣人之治,虚其心,实其腹,弱其志,常使民无知无欲。”
使被统治的对象愚昧化,处于无知的状态,可以使统治的成本降低。
所谓“最少知识”原则,实际上便是老子的“使民无知”的统治之术。

一个软件系统可以看成是一个虚拟的世界,设计师本人就是驾驭这个世界的统治者。


场景举例·叁 老子不相往来

《老子》云:“小国寡民……邻国相望,鸡犬之声相闻,民至老死而不相往来。”
这里讲的是降低统治成本的方法。将被统治的对象隔离开来,使他们没有直接的通信,可以达到分化瓦解,继而分而治之的效果。
所谓迪米特法则,便是设法是一个软件系统的不同对象彼此之间尽量“不相往来”,降低系统维护成本的法则。


迪米特法则的实现方法

从迪米特法则的定义和特点可知,它强调以下两点:
① 从依赖着的角度来说,只依赖应该依赖的对象;
② 从被依赖者的角度说,只暴露应该暴露的方法。

所以,在运用迪米特法则时要注意以下6点:
① 在类的划分上,应该创建弱耦合的类。类与类之间的耦合越弱,就越有利于实现可复用的目标;
② 在类的结构设计上,尽量降低类成员的访问权限;
③ 在类的设计上,优先考虑将一个类设置成不变类。
④ 在对其他类的引用上,将引用其他对象的次数降到最低。
⑤ 不暴露类的属性成员,而应该提供相应的访问器(set和get方法)
⑥ 谨慎使用序列化(Serializable)功能


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值