✅什么是充血模型和贫血模型?

典型回答

充血模型(Domain Driven Design)是一种面向对象的软件设计方法,它强调将业务逻辑封装在领域对象中。

假设有一个电商网站,需要对商品进行购买、库存管理等操作。在充血模型中,我们可以定义一个Product类来表示商品。Product类会包含商品的属性(例如名称、价格、库存等),并且也会包含一些行为(例如购买商品、更新库存等)。这些行为是直接封装在Product类中的,以便于对商品进行操作。

public class Product{
    private String productName;
    private BigDecimal price;
    private Long stock;

     public void purchase(int quantity) {
      if (quantity > stock) {
          throw new IllegalArgumentException("Not enough stock available");
      }
      stock -= quantity;
  }


}

贫血模型(Anemic Domain Model)则是一种将数据与行为分离的模型,其中数据由对象持有,而行为则由外部服务提供。

在贫血模型中,Product类可能只包含商品的属性(例如名称、价格、库存等),而行为则由其他类或服务提供。例如,我们可能会创建一个ProductService类来提供购买商品、更新库存等操作,而Product类只用于存储数据。这种方式下,Product类只是一个被动的数据持有者,而没有自己的行为。

public class Product {
    private String name;
    private double price;
    private int stock;

    public Product(String name, double price, int stock) {
        this.name = name;
        this.price = price;
        this.stock = stock;
    }

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public int getStock() {
        return stock;
    }
}

public class ProductService {
    public void purchase(Product product, int quantity) {
        if (quantity > product.getStock()) {
            throw new IllegalArgumentException("Not enough stock available");
        }
        product.setStock(product.getStock() - quantity);
    }
}

扩展知识

优缺点及适用场景

充血模型的优点:

  1. 面向对象设计,具有良好的封装性和可维护性。
  2. 领域对象自包含业务逻辑,易于理解和扩展。
  3. 可以避免过度依赖外部服务,提高系统的稳定性。

充血模型的缺点:

  1. 需要对模型的理解才能更好的开发,上手成本高
  2. 对象间的协作可能增加,导致设计变得复杂。
  3. 对象的状态可能会变得不一致,需要特别注意。

贫血模型的优点:

  1. 数据与行为分离,降低了对象的复杂度。
  2. 可以提高代码的重用性和可测试性。
  3. 可以更好地利用现有的服务和框架。

贫血模型的缺点:

  1. 对象缺乏封装性,易于出现耦合性和脆弱性。
  2. 业务逻辑被分散在多个类中,难以维护和理解。
  3. 过度依赖外部服务,可能导致系统的不稳定性。

一般来说,对于较小的应用系统或者简单的业务流程,可以使用贫血模型;对于较大的应用系统或者复杂的业务流程,建议使用充血模型。

原文: https://www.yuque.com/hollis666/xkm7k3/pwkg8x5x0vqoi7zg