在实际的软件开发中,我们经常会写下面这样的代码:
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
代码看上去没有太大的问题,但实际上其中任意一个方法发生变化时,这段代码都需要修改。因为调用是依赖的每一个细节,不仅增加了耦合,也使代码结构僵化。
迪米特法则正是为了避免对象间出现这样过多的细节依赖而被提出来,所以今天我们就来一起了解下迪米特法则带给我们的一些启示。
1、什么是迪米特法则
迪米特法则(Law of Demeter,简称 LoD) 是由 Ian Holland 于 1987 年提出来的,它的核心原则是:
-
一个类只应该与它直接相关的类通信;
-
每一个类应该知道自己需要的最少知识。
换句话说,在面向对象编程中,它要求任何一个对象(O)的方法(m),只应该调用以下对象:
-
对象(O)自身;
-
通过方法(m)的参数传入的对象;
-
在方法(m)内创建的对象;
-
组成对象(O)的对象;
-
在方法(m)的范围内,可让对象(O)访问的全局变量。
在分层架构中,每一层的模块只能调用自己层中的模块,跳过某一层直接调用另一层中的模块其实就是违反了分层架构的原则。
虽然迪米特法则符合封装的原理,但是却和聚合原则相冲突,因为对象需要尽可能少地考虑其他对象,不能轻易地和其他对象自由组合。
如何实现满足迪米特法则的代码
下面我们通过一个经典案例来看下如何去实现满足迪米特法则的代码。
假设一个在超市购物的场景:顾客选好商品后,到收银台找收银员结账。这里我们定义一个顾客类(Customer)、收银员类(PaperBoy )、钱包类(Wallet ),示例代码如下:
//顾客
public class Customer {
private String firstName;
private String lastName;
private Wallet myWallet;
public String getFirstName(){
return firstName;</