策略模式的简单应用

策略模式

  • 上下文和具体策略是松耦合关系。因此上下文只知道它要使用某一个实现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;
    }
}

审批还有多个状态就不一一写出了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值