贫血模型(Anemic Domain Model)是一种在软件开发中常见的反模式,尤其是在面向对象编程和领域驱动设计(领域驱动设计)中。它指的是领域模型(Domain Model)中,对象主要只包含数据(属性),而缺乏行为(方法)。换句话说,贫血模型中的对象更像是一个“数据容器”,而不是一个具有丰富行为的领域对象。

主要特点:

  1. 数据与行为分离:贫血模型中的类通常只包含属性(数据),而业务逻辑被放在服务层(Service Layer)或管理器(Manager)中。领域对象本身不包含任何业务逻辑。
  2. 面向过程的编程风格:贫血模型通常会导致代码更像面向过程的编程风格,而不是面向对象。业务逻辑集中在服务层,而不是分布在领域对象中。
  3. 领域对象被动:贫血模型中的领域对象是被动的,它们只是被服务层操作的数据结构,而不是主动参与业务逻辑的对象。

一个简单的例子:

假设我们有一个“订单”系统,贫血模型的实现可能如下:

// 贫血模型中的订单类
public class Order {
    private String orderId;
    private String customerId;
    private double totalAmount;
    private String status;
 
    // 只有getter和setter,没有业务逻辑
    public String getOrderId() { return orderId; }
    public void setOrderId(String orderId) { this.orderId = orderId; }
    public String getCustomerId() { return customerId; }
    public void setCustomerId(String customerId) { this.customerId = customerId; }
    public double getTotalAmount() { return totalAmount; }
    public void setTotalAmount(double totalAmount) { this.totalAmount = totalAmount; }
    public String getStatus() { return status; }
    public void setStatus(String status) { this.status = status; }
}
 
// 服务层包含所有业务逻辑
public class OrderService {
    public void placeOrder(Order order) {
        // 验证订单
        if (order.getTotalAmount() <= 0) {
            throw new IllegalArgumentException("订单金额必须大于0");
        }
        // 保存订单
        saveOrder(order);
        // 更新状态
        order.setStatus("PLACED");
    }
 
    private void saveOrder(Order order) {
        // 保存订单到数据库
    }
}

在这个例子中,Order类只是一个数据容器,所有的业务逻辑都集中在OrderService中。这种设计违背了面向对象的设计原则,即对象应该封装数据和行为。