在充血模型(Rich Domain Model)中,对象的“行为”和“状态管理”:
-
行为(Behavior) :
- 这指的是领域对象执行的动作或操作,通常是通过对象的方法(函数)来实现的。这些方法定义了对象可以做什么,以及它如何响应来自外部的请求。
-
状态(State) :
- 这指的是领域对象在任何给定时间点的内部数据或属性的集合。状态可以影响对象的行为,并且对象的行为可能会改变其状态。
在充血模型中,领域对象负责管理自己的状态,这意味着它们不仅拥有数据(状态),还拥有改变这些数据的逻辑(行为)。领域对象的状态管理包括确保状态的完整性、一致性,以及在状态变化时执行任何必要的业务规则或约束。
肖哥弹架构 跟大家“弹弹” 代码设计技巧,需要代码关注
欢迎 点赞,点赞,点赞。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
- 依赖倒置原则:支付网关设计应用案例
- Holder模式(Holder Pattern):公司员工权限管理系统实战案例分析
- 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
- 写代码总被Dis:5个项目案例带你掌握SOLID技巧,代码有架构风格
- 里氏替换原则在金融交易系统中的实践,再不懂你咬我
案例:
银行账户案例:
public class BankAccount {
private String accountNumber;
private double balance; // 这是对象的状态
// 构造器和其他业务方法
public BankAccount(String accountNumber, double initialBalance) {
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
// 存款方法,改变状态
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
} else {
throw new IllegalArgumentException("Deposit amount must be positive");
}
}
// 取款方法,改变状态
public void withdraw(double amount) {
if (amount > 0 && balance >= amount) {
balance -= amount;
} else {
throw new IllegalArgumentException("Insufficient funds or invalid amount");
}
}
// 获取余额,不改变状态
public double getBalance() {
return balance;
}
// 其他相关行为...
}
在这个例子中:
balance
是BankAccount
对象的状态,它表示账户的当前余额。deposit
和withdraw
是改变状态的行为。这些方法不仅改变了账户余额(状态),还包含了业务逻辑,例如检查存款金额是否为正,以及取款时是否有足够的资金。getBalance
是一个查询方法,它允许外部读取当前余额,但不改变它。
充血模型的设计哲学强调将行为和状态封装在同一个对象内,使得领域对象能够自主管理自己的状态,同时提供有意义的行为来与外部世界交互。这种封装确保了对象的完整性和一致性,因为只有对象自己知道如何正确地改变其状态。
充血模型中的状态管理指的是领域对象负责维护和控制自己的状态信息,确保状态的完整性和一致性。领域对象不仅包含业务逻辑,还包含确保对象状态有效性的逻辑。以下是案例说明:
贫血模型中的状态管理:
电子商务平台中的购物车系统,用户可以向购物车添加商品,修改商品数量,或从购物车中移除商品。
在贫血模型中,购物车可能仅仅是一个包含商品列表的数据结构,而所有与状态相关的逻辑(如检查商品库存、计算总价、应用促销规则)都放在外部的购物车服务类中。
// 贫血模型中的购物车类
public class ShoppingCart {
private List<Product> products;
public void addProduct(Product product) {
products.add(product);
}
// ... 其他基本操作,但不含状态管理逻辑
}
// 外部服务类包含业务逻辑
public class ShoppingCartService {
public void applyDiscount(ShoppingCart cart) {
// 应用折扣逻辑
}
public double calculateTotal(ShoppingCart cart) {
// 计算总价逻辑
}
}
充血模型中的状态管理:
在充血模型中,购物车对象负责管理自己的状态,包括商品的添加、删除和数量更新,以及相关的业务规则。
// 充血模型中的购物车类
public class ShoppingCart {
private List<CartItem> cartItems;
public void addProduct(Product product) {
// 检查库存
if (InventoryService.checkAvailability(product)) {
CartItem item = new CartItem(product);
cartItems.add(item);
} else {
throw new RuntimeException("Product out of stock");
}
}
public double calculateTotal() {
return cartItems.stream()
.mapToDouble(CartItem::getTotalPrice)
.sum();
}
// 其他与购物车状态管理相关的业务逻辑
}
// 购物车项
public class CartItem {
private Product product;
private int quantity;
public CartItem(Product product) {
this.product = product;
this.quantity = 1;
}
public double getTotalPrice() {
return product.getPrice() * quantity;
}
// 增加商品数量的方法,可能包括检查库存的逻辑
public void incrementQuantity(int amount) {
if (InventoryService.checkAvailability(product, amount, this.quantity, this.quantity + amount)) {
this.quantity += amount;
} else {
throw new RuntimeException("Cannot increment quantity: Product out of stock");
}
}
}
// 库存服务,由领域对象在需要时调用
public class InventoryService {
public static boolean checkAvailability(Product product, int requiredQuantity) {
// 检查库存的逻辑
return true; // 设总是有足够的库存
}
}
解决的问题:
- 封装性增强:购物车的状态管理逻辑封装在
ShoppingCart
和CartItem
类中,而不是分散在外部服务中。 - 业务逻辑集中:每个领域对象都包含自己的业务逻辑,使得逻辑更加集中和易于管理。
- 降低耦合度:领域对象之间的交互减少了对外部服务的依赖。
- 提高可维护性:集中的业务逻辑和封装的状态管理使得系统更易于维护和扩展。