java策略模式代码案例

本文详细介绍了如何使用策略模式在Java中处理不同币种的结算方式,通过抽象类、具体实现类、枚举和上下文管理器,实现在请求参数中动态选择合适的结算算法。
摘要由CSDN通过智能技术生成

如果大家对策略模式不是很了解的话可以先看前面文章 ~~~>策略模式

以下我们以付款场景为例:
不用币种有不同的结算方式,币种类型和金额都是通过请求参数带入后执行不同的算法,然后返回计算结果. 以下案例适用于所有类似的场景业务

直接上代码:

一:先定义抽象类

/**
 * 结算抽象类
 * @author jianYuan.zhu
 */
public interface SettleInterface {

    /**
     * 此方法用来判断具体执行哪一个实现类
     * @param operation 操作枚举
     * @return
     */
    boolean isSupport(Integer operation);

    /**
     * 结算核心算法
     * @param BigDecimal amount 金额       
     * @param Integer currencyType 币种类型
     */
    String settle(BigDecimal amount , Integer currencyType);
}

二:定义具体实现类

人名币

/**
 * 人名币结算实现类
 * @author jianYuan.zhu
 */
@Slf4j
@Service
public class RmbSettleService implements SettleInterface {

    @Override
    public boolean isSupport(Integer operation) {
        return CurrencyTypeEnum.RMB.code() == operation;
    }

    @Override
    public BigDecimal settle(BigDecimal amount , Integer currencyType){
        BigDecimal result = BigDecimal.ZERO;
         //todo 具体自己的业务逻辑
        return result;
    }
}

美元

/**
 * 美元结算实现类
 * @author jianYuan.zhu
 */
@Slf4j
@Service
public class UsdSettleService implements SettleInterface {

    @Override
    public boolean isSupport(Integer operation) {
        return CurrencyTypeEnum.USD.code() == operation;
    }

    @Override
    public BigDecimal settle(BigDecimal amount , Integer currencyType){
        BigDecimal result = BigDecimal.ZERO;
         //todo 具体自己的业务逻辑
        return result;
    }
}

日元

/**
 * 日元结算实现类
 * @author jianYuan.zhu
 */
@Slf4j
@Service
public class JpySettleService implements SettleInterface {

    @Override
    public boolean isSupport(Integer operation) {
        return CurrencyTypeEnum.JPY.code() == operation;
    }

    @Override
    public BigDecimal settle(BigDecimal amount , Integer currencyType){
        BigDecimal result = BigDecimal.ZERO;
         //todo 具体自己的业务逻辑
        return result;
    }
}

枚举类

/**
 * 货币枚举类
 */
@Getter
public enum CurrencyTypeEnum{
    RMB(1, "人民币"),
    USD(2, "美元"),
    JPY(3, "日元");
    

    private final Integer code;
    private final String value;

    CurrencyTypeEnum(Integer code, String value) {
        this.code = code;
        this.value = value;
    }

    public int code() {
        return code;
    }

    public String value() {
        return value;
    }

    public static String getValueByCode(Integer code) {
        if (code == null) return null;
        for (CurrencyTypeEnum enums : CurrencyTypeEnum.values()) {
            if (Objects.equals(enums.getCode(),code)) {
                return enums.getValue();
            }
        }
        return null;
    }
}

三: 上下文

/**
 * 结算上下文
 * @author jianYuan.zhu
 */
@Component
public class SettleOperationContext {
    private final List<SettleInterface> settleInterfaces;

    public SettleOperationContext (List<SettleInterface> settleInterfaces) {
        this.settleInterfaces = settleInterfaces ;
    }

    public BigDecimal settleAmount(BigDecimal amount ,Integer currencyType) {
        for (SettleInterface settleInterface: settleInterfaces) {
             if (settleInterface.isSupport(currencyType)){
                 return  settleInterface.settle(amount );
             }
        }
        return "没有符合的操作类型";
    }
}

四: 模拟调用代码

/**
 * @author jianYuan.zhu
 */
@RestController
public class SettleController {

    @Autowired
    private SettleOperationContext settleOperationContext ;

    @PostMapping("/settle")
    public String settleAmount(@RequestBody @Validated SettleReq settleReq) throws Exception {
       return settleOperationContext.settleAmount(settleReq.getAmount(), settleReq.getCurrencyType())
    }
}

以上便是完整的一个策略模式代码案例,平时工作中的类似业务场景也可以稍加改善就可以使用.

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值