很多程序员刚开始容易陷入构造贫血模型的情况,贫血模型在传统应用中普遍存在。贫血模型的数据和操作方法是分离的,它只包含数据,领域逻辑的实现委托给了领域服务。贫血模型如下:

    1. @Getter
    2. @Setter
    3. public class SnackMachine extends AggregateRoot {
    4. public Money moneyInside;
    5. public decimal moneyInTransaction;
    6. public List<Slot> slots;
    7. }
    8. @Getter
    9. @Setter
    10. public class SnackMachineService {
    11. public void buySnack(SnackMachine snackMachine, int position) {
    12. }
    13. public void loadSnacks(SnackMachine snackMachine, int position, SnackPile snackPile) {
    14. }
    15. public void loadMoney(SnackMachine snackMachine, Money money) {
    16. }
    17. }

    SnackMachine只包含数据,所有操作委托至SnackMachineService领域服务。在面向对象语言中,引入贫血模型是不可接受的。因为它和面向对象编程理念背道而驰。可以看到贫血模型积弱的封装性。所有字段都是public,将领域逻辑的实现委托至领域服务势必会导致领域模型的开放,贫血模型机制决定了领域模型封装性极低的特性。这样的代码维护异常艰难。