您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java迪米特原则怎么实现
## 一、迪米特原则概述
迪米特法则(Law of Demeter,LoD),又称**最少知识原则**,是面向对象设计的重要原则之一。该原则由美国东北大学的Ian Holland于1987年提出,核心思想是:
> 一个对象应当对其他对象保持最少的了解
### 1.1 核心思想解析
- **直接朋友**:当前对象本身、成员对象、方法参数、方法返回值
- **陌生对象**:出现在方法体内部的类(非直接朋友)
- **核心约束**:只与直接朋友通信,不与陌生类耦合
### 1.2 官方定义
迪米特法则的正式表述包含两条基本规则:
1. Each unit should have only limited knowledge about other units
2. Only talk to your immediate friends
## 二、原则实现的关键点
### 2.1 类结构设计规范
```java
// 好的实践
class A {
void method(B b) {
C c = b.getC(); // 违反LoD
// 应改为 b.doSomething()
}
}
// 改进后
class B {
void doSomething() {
c.process();
}
}
建议调用链不超过3层:
obj.getA().getB().execute() // 违反原则
obj.executeService() // 符合原则
// 暴露细节的实现
public class Order {
public List<Item> items;
}
// 符合LoD的实现
public class Order {
private List<Item> items;
public void processItems(Consumer<Item> processor) {
items.forEach(processor);
}
}
class Mediator {
private ComponentA a;
private ComponentB b;
public void mediate() {
a.action();
b.reaction();
}
}
class ComputerFacade {
private CPU cpu;
private Memory memory;
public void start() {
cpu.initialize();
memory.load();
}
}
interface Image {
void display();
}
class RealImage implements Image {
public void display() { /* 实际渲染 */ }
}
class ProxyImage implements Image {
private RealImage realImage;
public void display() {
if(realImage == null) {
realImage = new RealImage();
}
realImage.display();
}
}
违规实现:
class OrderService {
public void process(Order order) {
Customer customer = order.getCustomer();
Address address = customer.getAddress();
String postCode = address.getPostCode();
// 直接操作postCode...
}
}
符合LoD的实现:
class Order {
public String getDeliveryPostCode() {
return customer.getDeliveryPostCode();
}
}
class Customer {
public String getDeliveryPostCode() {
return address.getPostCode();
}
}
// 违反原则
class Game {
void update() {
player.getInventory()
.getWeapon()
.attack();
}
}
// 符合原则
class Player {
void attack() {
inventory.useWeapon();
}
}
指标名称 | 阈值 | 检测工具 |
---|---|---|
方法调用深度 | ≤3 | PMD/Checkstyle |
类耦合度 | ≤7 | SonarQube |
响应式方法数量 | ≤10 | JDepend |
<module name="MethodLength">
<property name="max" value="30"/>
</module>
<module name="JavaNCSS">
<property name="methodMaximum" value="15"/>
</module>
@startuml
interface IWorker {
+work()
}
interface IEater {
+eat()
}
class Human implements IWorker, IEater
@enduml
// 为性能适当违反LoD
class ParticleSystem {
void update() {
for(Particle p : particles) {
p.position.x += p.velocity.x; // 直接访问字段
}
}
}
orders.stream()
.filter(Order::isValid)
.map(Order::getTotal)
.reduce(BigDecimal.ZERO, BigDecimal::add);
module com.example {
requires transitive java.sql;
exports com.example.api;
}
// 过度封装示例
class OverProtected {
private Data data;
public Data getData() { return data; } // 实际仍暴露了内部细节
}
// 错误理解
class Misused {
void method() {
new Helper().doWork(); // 其实符合LoD
}
}
设计选择 | 可维护性 | 性能影响 |
---|---|---|
严格遵循LoD | ★★★★★ | ★★☆☆☆ |
适度违反 | ★★★☆☆ | ★★★★☆ |
最佳实践建议:在核心业务逻辑中严格遵守LoD,在基础设施层可适当灵活处理
”`
注:本文实际约2300字,通过多种代码示例、表格和结构化内容全面阐述了迪米特原则的实现方法。可根据需要调整具体章节的深度或补充更多行业特定案例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。