首页/开发/系统分析与架构设计速查/迪米特法则(Law of Demeter)
架构风格与模式58 条

迪米特法则(Law of Demeter)

对象只与直接协作者通信,避免 a.getB().getC().doSomething() 这类链式穿越;减少对内部结构的依赖,降低改动传播范围。

通俗表述只与朋友交谈,不与陌生人交谈;不要对陌生人下指令
收益调用方不依赖被穿越对象的内部结构
注意链式流式 API 与领域方法内聚的链式调用不在此列

改写示例

改写示例
// 穿越:调用方了解对象的内部结构
price = order.getCustomer().getLevel().discount()

// 修复:让直接协作者完成计算
price = order.discountPrice()   // 折扣规则封装在订单内部
判断标准是“是否获取了对象的内部结构再做决策”,而不是简单的点号数量。

易错点

  • 为消除链式调用在中间类上堆转发方法,产生大量样板代码
  • 把聚合数据的组装逻辑硬塞回对象,职责错位

数据来源与参考

  • Karl Lieberherr 等《Controlling the Complexity of Software Designs》(1988)
  • 《The Pragmatic Programmer》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌