ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

面向接口编程-应用审批

2022-05-08 12:32:49  阅读:163  来源: 互联网

标签:audit doAction 编程 接口 auditCommitResDto public 面向 new id


 

 

需求如上,上次已经 使用策略模式 和工厂将审批的动作实现了:

 

public enum AuditActionEnum {

commit("commit", "提交审核"),
approvePass("approvePass", "审核通过"),
approveReject("approveReject", "审核拒绝");

private String key;
private String desc;

AuditActionEnum(String key, String desc) {
this.key = key;
this.desc = desc;
}

public String getKey() {
return this.key;
}
public String getDesc() {
return this.desc;
}

public static AuditActionEnum match(String key) {
for (AuditActionEnum e : AuditActionEnum.values()) {
if (e.getKey().equals(key)) {
return e;
}
}
return null;
}
}

 

@Component
public interface IAuditStrategy {
void doAction(IService service , Long id , AuditCommitResDto auditCommitResDto);
}
具体实现子类:
@Component("commit")
public class CommitAuditStrategy implements IAuditStrategy {
@Override
public void doAction(IService service, Long id, AuditCommitResDto auditCommitResDto) {
service.update(new UpdateWrapper<>()
.set("audit_id", auditCommitResDto.getAuditId())
.set("commit_time", auditCommitResDto.getCommitTime())
.set("audit_state", auditCommitResDto.getAuditState())
.eq("id", id)
);
}
}


@Component("approvePass")
public class ApprovePassAuditStrategy implements IAuditStrategy {
@Override
public void doAction(IService service, Long id, AuditCommitResDto auditCommitResDto) {
//审核通过先把之前数据失效 ,在把通过的这条生效
service.update(new UpdateWrapper<>()
.set("is_effective", EffectMasterEnum.effect.getKey())
.eq("master_id", id)
);
service.update(new UpdateWrapper<>()
.set("is_effective", EffectMasterEnum.effect.getKey())
.set("audit_time", auditCommitResDto.getAuditTime())
.set("audit_state", auditCommitResDto.getAuditState())
.eq("id", id)

);
}
}


再仔细看看,发现其实做的事情都是同样的:即 对
is_effective 生效
audit_time 审批时间
audit_state 审批状态 

这三个字段进行更新。
例子:假如对商品进行审批 (用 @Data 省略了 set get 方法)
@Data
ProductEntity {
id
productName
isEffective 
auditTime 
auditState 
}
对销量进行审批:
@Data
SellEntity {
id
count
isEffective 
auditTime 
auditState 
}

通过观察不难发现 :只要 需要进行审批 就必须 有
is_effective 生效
audit_time 审批时间
audit_state 审批状态 
这三个字段,于是想通过 将三个字段提取出来为一个类:
@Data
AuditEntity {
isEffective 
auditTime 
auditState 
}

@Data
ProductEntity extends AuditEntity {
id 
productName
}
对销量进行审批:
@Data
SellEntity  extends AuditEntity 
{
id
count
}

然后 对策略开始修改:



@Component("commit")
public class CommitAuditStrategy implements IAuditStrategy {
@Override
public void doAction(Audit audit , AuditCommitResDto auditCommitResDto) {
audit.setAuditTime(auditCommitResDto.getCommitTime())
             audit.setAuditState(auditCommitResDto.getAuditState())
);
    }
}

调用:

如果是商品审批
ProductEntity  product = new ProductEntity 
auditCommitResDto =  调接口返回
auditStrategyMap.get(dto.getAuditAction()).doAction(product ,auditCommitResDto);
this.update (product )
 
SellEntity  sell= new SellEntity 
auditCommitResDto =  调接口返回
auditStrategyMap.get(dto.getAuditAction()).doAction(sell,auditCommitResDto);
this.update (sell)

到这里看起就已经将需求实现了,但仍然有问题。 使用 继承不易于拓展 ,并且entity,java 中不允许使用多继承,所以组长希望叫我改成接口方式,于是改将audit 改成接口:

interface IAuditEntity {
 void setIsEffective(Integer isEffective);

void setAuditState(String auditState);
void setAuditTime(Date auditTime);
}

@Data
ProductEntity implements IAuditEntity {
id 
productName
isEffective 
auditTime 
auditState 
}
对销量进行审批:
@Data
SellEntity implements IAuditEntity {
id 
count
isEffective 
auditTime 
auditState 
}


然后 对策略开始修改:



@Component("commit")
public class CommitAuditStrategy implements IAuditStrategy {
@Override
public void doAction(IAuditEntity audit , AuditCommitResDto auditCommitResDto) {
             audit.setAuditTime(auditCommitResDto.getCommitTime())
             audit.setAuditState(auditCommitResDto.getAuditState())
);
    }
}
调用:
如果是商品审批
ProductEntity  product = new ProductEntity 
auditCommitResDto =  调接口返回
auditStrategyMap.get(dto.getAuditAction()).doAction(product ,auditCommitResDto);
this.update (product )
 
SellEntity  sell= new SellEntity 
auditCommitResDto =  调接口返回
auditStrategyMap.get(dto.getAuditAction()).doAction(sell,auditCommitResDto);
this.update (sell)

用接口 还有一个好处,其一是接口可以多实现 ,更易于拓展。其二 只要涉及审批相关的实体,倒逼着开发一定要有审批相关的几个字段。(因为entity 用mybatits plus 绑定了数据库表字段 所以表设计的时候就不会漏字段)
这时才想起来 接口的意义:定义规范。 并且这体现java语言的多态,
IAuditEntity  product=  new ProductEntity 
IAuditEntity  product=  new SellEntity 
这里和 List list = new ArrayList() List list = new LinkList() 一样。 






标签:audit,doAction,编程,接口,auditCommitResDto,public,面向,new,id
来源: https://www.cnblogs.com/publicmain/p/16245271.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有