您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。