贫血模型(Anemic Domain Model)是一种在软件开发中常见的反模式,尤其是在面向对象编程和领域驱动设计(领域驱动设计)中。它指的是领域模型(Domain Model)中,对象主要只包含数据(属性),而缺乏行为(方法)。换句话说,贫血模型中的对象更像是一个“数据容器”,而不是一个具有丰富行为的领域对象。
主要特点:
- 数据与行为分离:贫血模型中的类通常只包含属性(数据),而业务逻辑被放在服务层(Service Layer)或管理器(Manager)中。领域对象本身不包含任何业务逻辑。
- 面向过程的编程风格:贫血模型通常会导致代码更像面向过程的编程风格,而不是面向对象。业务逻辑集中在服务层,而不是分布在领域对象中。
- 领域对象被动:贫血模型中的领域对象是被动的,它们只是被服务层操作的数据结构,而不是主动参与业务逻辑的对象。
一个简单的例子:
假设我们有一个“订单”系统,贫血模型的实现可能如下:
// 贫血模型中的订单类
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
中。这种设计违背了面向对象的设计原则,即对象应该封装数据和行为。