注解实现策略模式

代码结构如下

代码如下

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;
    }
相关推荐
yaoh.wang8 小时前
力扣(LeetCode) 13: 罗马数字转整数 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
醇氧8 小时前
【Windows】优雅启动:解析一个 Java 服务的后台启动脚本
java·开发语言·windows
小鸡吃米…9 小时前
Python PyQt6教程七-控件
数据库·python
1916zz10 小时前
Extreme programing 方利喆 _ 江贤晟
python
长安牧笛10 小时前
智能鞋柜—脚气终结者,内置温湿度传感器和紫外线灯,晚上回家,把鞋放进去,自动检测湿度,湿度超标就启动烘干+紫外线杀菌,第二天穿鞋干燥无异味。
python
weixin_4577600010 小时前
PIL库将图片位深度是1、8、32统一转换为24的方法
python
小小代码团11 小时前
2026 Office Online Server (全网最新/最详细/含问题修复) 终极部署教程
windows·microsoft·c#
Lucky高11 小时前
Pandas库入门
python·pandas
小鸡吃米…11 小时前
Python PyQt6教程三-菜单与工具栏
开发语言·python
爱吃山竹的大肚肚11 小时前
EasyPOI 大数据导出
java·linux·windows