注解实现策略模式

代码结构如下

代码如下

java 复制代码
@Getter
@AllArgsConstructor
public enum AuditPlutusEnum {

    BACK("回款"),

    REFUND("退款"),

    INVOICE("开票");

    private final String name;
}
java 复制代码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
public @interface AuditStrategyType {

    @AliasFor(annotation = Component.class)
    String value() default "";

    AuditPlutusEnum type();


}
java 复制代码
 */
@Configuration
public class AuditStrategyConfig {

    @Bean
    public AuditStrategyRunner auditStrategyRunner(List<AuditPlutusStrategy> strategies) {
        Map<AuditPlutusEnum, AuditPlutusStrategy> strategyMap = strategies.stream()
                .collect(Collectors.toMap(
                        // 获取策略标识
                        s -> s.getClass().getAnnotation(AuditStrategyType.class).type(),
                        s -> s
                ));
        return (flag, auditPlutusRo) -> strategyMap.get(flag).audit(auditPlutusRo);
    }
}
java 复制代码
public interface AuditStrategyRunner {


    void audit(AuditPlutusEnum type, AuditPlutusRo auditPlutusRo);
}
java 复制代码
public interface AuditPlutusStrategy {


    void audit(AuditPlutusRo ro);
}
java 复制代码
@AuditStrategyType(type = AuditPlutusEnum.REFUND)
public class AuditRefundStrategy implements AuditPlutusStrategy {

    @Override
    public void audit(AuditPlutusRo ro) {
        // todo: 2024/1/24  退款相关处理
    }
}```

```java
@AuditStrategyType(type = AuditPlutusEnum.INVOICE)
public class AuditInvoiceStrategy implements AuditPlutusStrategy {

    @Override
    public void audit(AuditPlutusRo ro) {
        // todo: 2024/1/24  开票相关处理
    }
}
java 复制代码
@AuditStrategyType(type = AuditPlutusEnum.BACK)
public class AuditBackStrategy implements AuditPlutusStrategy {

    @Override
    public void audit(AuditPlutusRo ro) {
        // todo: 2024/1/24  回款相关处理
    }
}

调用

java 复制代码
    @Autowired
    private AuditStrategyRunner auditStrategyRunner;

    public ResultData<?> auditBack(AuditPlutusRo ro) {
        log.info("【{}】审核-业财回调处理,审核编号为:{},传入参数为:{}", ro.getAuditPlutusEnum().getName(), ro.getAuditNo(), JSON.toJSONString(ro));
        auditStrategyRunner.audit(ro.getAuditPlutusEnum(), ro);
        return ResultData.SUCCESS;
    }
相关推荐
不知名的老吴2 分钟前
线程的生命周期之线程“插队“
java·开发语言·python
xsc6996751 小时前
从零搭建大模型与智能体平台 - 完整技术详解
python
无风听海2 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
CTA终结者3 小时前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链
马士兵教育3 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
KaMeidebaby3 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy6183 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
caimouse3 小时前
Reactos 第 5 章 进程与线程 — 5.8 Windows 的 APC 机制
c语言·windows
天佑木枫4 小时前
15天Python入门系列 · 序
开发语言·python
happylifetree4 小时前
Python017-第二章15.数据容器-dict常用操作
python