主题
面试速答(先看这里)
**一句话结论:**假设有一个电商网站,需要对商品进行购买、库存管理等操作。
60秒标准回答:
充血模型(Domain Driven Design)是一种面向对象的软件设计方法,它强调将业务逻辑封装在领域对象中
假设有一个电商网站,需要对商品进行购买、库存管理等操作。在充血模型中,我们可以定义一个Product类来表示商品。Product类会包含商品的属性(例如名称、价格、库存等),并且也会包含一些行为(例如购买商品、更新库存等)。这些行为是直接封装在Product类中的,以便于对商品进行操作
贫血模型(Anemic Domain Model)则是一种将数据与行为分离的模型,其中数据由对象持有,而行为则由外部服务提供
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**充血模型(Domain Driven Design)是一种面向对象的软件设计方法,它强调将业务逻辑封装在领域对象中。
- **要点2:**贫血模型(Anemic Domain Model)则是一种将数据与行为分离的模型,其中数据由对象持有,而行为则由外部服务提供。
- **要点3:**在贫血模型中,Product类可能只包含商品的属性(例如名称、价格、库存等),而行为则由其他类或服务提供。
- **要点4:**一般来说,对于较小的应用系统或者简单的业务流程,可以使用贫血模型;
**记忆锚点:**Product → 充血模型 → 贫血模型 → Domain → ProductService → 什么是充血模型和贫血模型
易错提醒:
- 可以避免过度依赖外部服务,提高系统的稳定性。
- 对象的状态可能会变得不一致,需要特别注意。
加分表达:
- 优缺点及适用场景 充血模型的优点: 面向对象设计,具有良好的封装性和可维护性。
- 对于较大的应用系统或者复杂的业务流程,建议使用充血模型。
追问准备:
- 围绕「Product」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「充血模型」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「贫血模型」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
充血模型(Domain Driven Design)是一种面向对象的软件设计方法,它强调将业务逻辑封装在领域对象中。
假设有一个电商网站,需要对商品进行购买、库存管理等操作。在充血模型中,我们可以定义一个Product类来表示商品。Product类会包含商品的属性(例如名称、价格、库存等),并且也会包含一些行为(例如购买商品、更新库存等)。这些行为是直接封装在Product类中的,以便于对商品进行操作。
plain
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类只是一个被动的数据持有者,而没有自己的行为。
plain
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;
}
}plain
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);
}
}扩展知识
优缺点及适用场景
充血模型的优点:
- 面向对象设计,具有良好的封装性和可维护性。
- 领域对象自包含业务逻辑,易于理解和扩展。
- 可以避免过度依赖外部服务,提高系统的稳定性。
充血模型的缺点:
- 需要对模型的理解才能更好的开发,上手成本高
- 对象间的协作可能增加,导致设计变得复杂。
- 对象的状态可能会变得不一致,需要特别注意。
贫血模型的优点:
- 数据与行为分离,降低了对象的复杂度。
- 可以提高代码的重用性和可测试性。
- 可以更好地利用现有的服务和框架。
贫血模型的缺点:
- 对象缺乏封装性,易于出现耦合性和脆弱性。
- 业务逻辑被分散在多个类中,难以维护和理解。
- 过度依赖外部服务,可能导致系统的不稳定性。
一般来说,对于较小的应用系统或者简单的业务流程,可以使用贫血模型;对于较大的应用系统或者复杂的业务流程,建议使用充血模型。