以前简单的了解过关于贫血模型、充血模型的概念,一开始对这些概念也没什么感觉,最近在工作中,逐渐地有了些小感悟,尤其是关于充血模型可以更有效地避免重复代码。一个非常明显的就是 Object 的构造。假设有下面这个类。
class BankAccount {
private Integer money;
private Double rate;
}
在贫血模型中,就只有个空的构造函数,然后是一堆的 getter、setter,那么才使用这个类的时候,就不可避免可有一系列的,类似下面的代码。每次需要生产一个 BankAccount 对象是都不可避免地写下面三行代码。
BankAccount account = new BankAccount();
account.setMoney(1024);
account.setRate(0.02);
但是在充血模型中,你会有各种的需要的构造函数,生产一个 BankAccount 对象就只需要一行代码:
BankAccount account = new BankAccount(1024, 0.02);
这样一个简单的转化,代码就变得好看起来的。
再例如,如果你要计算收益,在贫血模型里面的做法可能是这样的,定义一个 AccountService,然后实现计算逻辑:
class AccountService {
public Double calAvenue(BankAccount account) {
return account.getMoney() * account.getRate();
}
}
// 调用
accountService.calAvenue(account);
但是在充血模型里面,就直接这样实现
class BankAccount {
public Double avenue() {
return money * rate;
}
}
// 使用的话,直接即可
account.avenue();
个人觉得第二中方法比第一种方法简洁、优雅太多了。
虽然上面对某些概念的理解或者解释或许不太正确,但是核心需要说明的是,将 Object 相关的逻辑,在 Object 内部实现,而不是在额外的例如 Servie 层里实现,既消灭的重复代码,也让代码变得更优雅、好看。