策略模式
- 上下文和具体策略是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。
- 策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。
情景
有很多需要审批的对象,比如商品,商户等,审批有多个审批行为,且都有对历史记录表修改,具体行为相似,可以使用策略模式优化(就是为了学习一下设计模式,哈哈哈),不多说直接上代码
1.Context(使用spring获取加载的实例)
@Component
public class AuditContext implements Context<Audit>, ApplicationContextAware, InitializingBean {
private ApplicationContext applicationContext;
private List<AuditStrategy> strategies;
@Override
public R execute(Audit param) {
for (AuditStrategy strategy : strategies) {
AuditEnum auditEnum = AuditEnum.valueOf(param.getAuditStatus());
if (!strategy.support(auditEnum)) {
continue;
}
return strategy.audit(param);
}
throw new ServiceException("未找到对应策略");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void afterPropertiesSet() throws Exception {
Map<String, AuditStrategy> beansMap = applicationContext.getBeansOfType(AuditStrategy.class);
Asserts.notEmpty(beansMap);
strategies = new ArrayList<>(beansMap.values());
}
}
2.Strategy
public interface AuditStrategy {
boolean support(AuditEnum auditEnum);
/**
* 审批操作
* @param audit
*/
R audit(Audit audit);
}
3.ConcreteStrategy
@Service
@AllArgsConstructor
public class AuditRejectImpl implements AuditStrategy {
@Override
public boolean support(AuditEnum auditEnum) {
return auditEnum == ProviderEnum.AUDIT_REJECT;
}
@Override
public R audit(Audit audit) {
return null;
}
}
审批还有多个状态就不一一写出了