@Autowired搭配@interface注解实现策略模式

文章描述了一个使用Java编程的场景,通过`transWay`和`transType`字段组合实现银行卡和社保卡支付、退货的动态逻辑分发。接口定义了ICommonService,每个交易类型对应一个服务实现,如BankConsumService、BankRefundService等,控制器根据传入的交易方式和类型调用相应服务。
摘要由CSDN通过智能技术生成

应用场景:存在银行卡和社保卡的支付、退货等接口,接口报文中使用transWay表示银行卡(0)和社保卡(1),transType表示支付(1)、退货(2)。那么由其组合便能出现四个逻辑,所以要实现动态的逻辑分发。

domain

@Data
public class PosApiReq {
    /** 交易方式 **/
    private String transWay;
    /** 交易类型 **/
    private String transType;
}

service

  • 接口定义
public interface ICommonService {

    public Object handler(String json);
}
  • 银行卡消费
@Service
@CodeType("01")
public class BankConsumService implements ICommonService{

    @Override
    public Object handler(String json) {
        System.out.println("银行卡消费开始:" + json);
        return "bank-consum";
    }
}
  • 银行卡退货
@Service
@CodeType("02")
public class BankRefundService implements ICommonService{

    @Override
    public Object handler(String json) {
        System.out.println("银行卡退货开始:" + json);
        return "bank-refund";
    }
}
  • 社保卡消费
@Service
@CodeType("11")
public class SocConsumService implements ICommonService{

    @Override
    public Object handler(String json) {
        System.out.println("社保卡消费开始:" + json);
        return "soc-consum";
    }
}
  • 社保卡退货
@Service
@CodeType("12")
public class SocRefundService implements ICommonService{

    @Override
    public Object handler(String json) {
        System.out.println("社保卡退货开始:" + json);
        return "soc-refund";
    }
}

controller

@RestController
public class ServerController {

    private final Map<String, ICommonService> handlerMap = new HashMap<>();

    @Autowired
    private void setHandler(List<ICommonService> commonServiceList) {
        for (ICommonService commonService : commonServiceList) {
            handlerMap.put(commonService.getClass().getAnnotation(CodeType.class).value(), commonService);
        }
    }


    @Anonymous
    @RequestMapping("/api")
    public Object api(@RequestBody PosApiReq posApiReq) {
        
        String transWay = posApiReq.getTransWay();
        String transType = posApiReq.getTransType();

        // 01 银行卡消费、02银行卡退货、11 社保卡消费、 12社保卡退货
        String value = transWay+transType;

        ICommonService commonService = handlerMap.get(value);

        Object object = commonService.handler(posApiReq.toString());
       
        return object;
    }
}

annotation

@Target(value={ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CodeType {
    String value();
}

此方式完美的解决了根据不通交易调用不通逻辑的问题,如果新添加一类交易,只需要扩展实现ICommonService 接口的新类就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jinwen5290

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值