请选择 进入手机版 | 继续访问电脑版

网赚研究院-致富网赚论坛-网赚宝盒-华夏网赚论坛-28网赚-贵族网赚论坛-日付网赚联盟

 找回密码
 立即注册
查看: 58|回复: 0

凤艳阁 DDD领域驱动设计:充血模型代码实例 姫川梨乃 071213-380

发表于 2020-1-15 14:01 | 580 显示全部楼层 |阅读模式

[复制链接]

2万

主题

4万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
85804
发表于 2020-1-15 14:01 | 显示全部楼层 |阅读模式
这是写在帖子头部的内容
请点击【关注】获得更多互联网和技夺目货,头条号IT徐胖子原创本文请勿转载,感激支持
1 贫血模子

我们一样平常操纵三层架构举行营业斥地:
Repository + Entity
Service + BO(Business Object)
Controller + VO(View Object)
在三层架构营业斥地中,大家经常操纵基于贫血模子的斥地形式。贫血模子是指营业逻辑全数放在service层,营业工具只包含数据不包含营业逻辑。我们来看代码实例。
/** * 账户营业工具 *  * @author 本日头条号「IT徐胖子」 * */public class AccountBO {/** * 账户ID */private String accountId;/** * 账户余额 */private Long balance;/** * 能否解冻 */private boolean isFrozen;public String getAccountId() {return accountId;}public void setAccountId(String accountId) {this.accountId = accountId;}public Long getBalance() {return balance;}public void setBalance(Long balance) {this.balance = balance;}public boolean isFrozen() {return isFrozen;}public void setFrozen(boolean isFrozen) {this.isFrozen = isFrozen;}}/** * 转账营业办究竟现 *  * @author 本日头条号「IT徐胖子」 * */@Servicepublic class TransferServiceImpl implements TransferService {@Autowiredprivate AccountService accountService;@Overridepublic boolean transfer(String fromAccountId, String toAccountId, Long amount) {AccountBO fromAccount = accountService.getAccountById(fromAccountId);AccountBO toAccount = accountService.getAccountById(toAccountId);/** 检查转出账户 **/if (fromAccount.isFrozen()) {throw new MyBizException(ErrorCodeBiz.ACCOUNT_FROZEN);}if (fromAccount.getBalance() < amount) {throw new MyBizException(ErrorCodeBiz.INSUFFICIENT_BALANCE);}fromAccount.setBalance(fromAccount.getBalance() - amount);/** 检查转入账户 **/if (toAccount.isFrozen()) {throw new MyBizException(ErrorCodeBiz.ACCOUNT_FROZEN);}toAccount.setBalance(toAccount.getBalance() + amount);/** 更新数据库 **/accountService.updateAccount(fromAccount);accountService.updateAccount(toAccount);return Boolean.TRUE;}}TransferServiceImpl实现类中就是贫血模子斥地方式,AccountBO只稀有据没有营业逻辑。全部代码气概偏向于面向进程,所以也有人把贫血模子称为反形式。
2 充血模子

在基于充血模子DDD斥地形式中我们引入了Domain层。Domain层包含了营业工具BO,但并不是仅仅包含数据,这一层也包含营业逻辑,我们来看代码实例。
/** * 账户营业工具 *  * @author 本日头条号「IT徐胖子」 * */public class AccountBO {/** * 账户ID */private String accountId;/** * 账户余额 */private Long balance;/** * 能否解冻 */private boolean isFrozen;/** * 归还计谋 */private DebitPolicy debitPolicy;/** * 入账计谋 */private CreditPolicy creditPolicy;/** * 归还方式 *  * @param amount 金额 */public void debit(Long amount) {debitPolicy.preDebit(this, amount);this.balance -= amount;debitPolicy.afterDebit(this, amount);}/** * 转入方式 *  * @param amount 金额 */public void credit(Long amount) {creditPolicy.preCredit(this, amount);this.balance += amount;creditPolicy.afterCredit(this, amount);}public boolean isFrozen() {return isFrozen;}public void setFrozen(boolean isFrozen) {this.isFrozen = isFrozen;}public String getAccountId() {return accountId;}public void setAccountId(String accountId) {this.accountId = accountId;}public Long getBalance() {return balance;}/** * BO和DO转换必须加set方式这是一种权衡 */public void setBalance(Long balance) {this.balance = balance;}public DebitPolicy getDebitPolicy() {return debitPolicy;}public void setDebitPolicy(DebitPolicy debitPolicy) {this.debitPolicy = debitPolicy;}public CreditPolicy getCreditPolicy() {return creditPolicy;}public void setCreditPolicy(CreditPolicy creditPolicy) {this.creditPolicy = creditPolicy;}}/** * 入账计谋实现 *  * @author 本日头条号「IT徐胖子」 * */@Servicepublic class CreditPolicyImpl implements CreditPolicy {@Overridepublic void preCredit(AccountBO account, Long amount) {if (account.isFrozen()) {throw new MyBizException(ErrorCodeBiz.ACCOUNT_FROZEN);}}@Overridepublic void afterCredit(AccountBO account, Long amount) {System.out.println("afterCredit");}}/** * 归还计谋实现 *  * @author 本日头条号「IT徐胖子」 * */@Servicepublic class DebitPolicyImpl implements DebitPolicy {@Overridepublic void preDebit(AccountBO account, Long amount) {if (account.isFrozen()) {throw new MyBizException(ErrorCodeBiz.ACCOUNT_FROZEN);}if (account.getBalance() < amount) {throw new MyBizException(ErrorCodeBiz.INSUFFICIENT_BALANCE);}}@Overridepublic void afterDebit(AccountBO account, Long amount) {System.out.println("afterDebit");}}/** * 转账营业办究竟现 *  * @author 本日头条号「IT徐胖子」 * */@Servicepublic class TransferServiceImpl implements TransferService {@Resourceprivate AccountService accountService;@Resourceprivate CreditPolicy creditPolicy;@Resourceprivate DebitPolicy debitPolicy;@Overridepublic boolean transfer(String fromAccountId, String toAccountId, Long amount) {AccountBO fromAccount = accountService.getAccountById(fromAccountId);AccountBO toAccount = accountService.getAccountById(toAccountId);fromAccount.setDebitPolicy(debitPolicy);toAccount.setCreditPolicy(creditPolicy);fromAccount.debit(amount);toAccount.credit(amount);accountService.updateAccount(fromAccount);accountService.updateAccount(toAccount);return Boolean.TRUE;}}AccountBO包含了计谋工具,计谋工具是可以实现营业逻辑的,这样把营业逻辑实现在计谋工具中,淘汰了service层面向进程的代码。
3 一些思考

有筚笠崴,充血形式就是把一些营业放在Domain层举行,没有什么出格之处。关于这个概念我有这些思考:
(1) 代码营业气概加倍面向工具,而不是面向进程,全部逻辑也变得加倍内聚明细。
(2) 在计划原则中有一条开闭原则:面向扩展开放,面向点窜封闭,我以为这是最垂危的一条计划原则,很多计划形式如计谋形式、模板方式形式都是基于这个原则计划的。充血模子BO中可以包含各类计谋,可以操纵计谋形式治理计谋。
(3) Domain层不是为了取代Service层,而是一种补充和增强,固然范围层和营业层都包含营业,可是用处不同。营业层可以组合不同范围的营业,而且可以增加流控、监控、日志、权限控制切面,相较于范围层更加丰富。
Lombok框架现在很是流行,使代码变得很是简便。有一点必要留意,随意操纵Lombok大要会破坏代码封装性,例如AccountBO工具不应当袒露setBalance方式,可是由于各层工具必要属性拷贝必须袒露setBalance方式,这也是一种权衡计谋。
请点击【关注】获得更多互联网和技夺目货,头条号IT徐胖子原创本文请勿转载,感激支持

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!
感激您的阅读
回复

使用道具 举报

0条回复
跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2015 忽悠兄 X3.2 © 2001-2013 Comsenz Inc.

Archiver|手机版|小黑屋| Comsenz Inc.  |网站地图

快速回复 返回顶部 返回列表