利用枚举实现策略模式

前言:使用策略者模式前需要了解其优缺点

  • 优点:策略模式提供了对“开闭原则”的完美支持,避免使用多重条件转移语句,如if…else…语句、switch 语句,干掉复杂难看的if-else。
  • 缺点:调用时,必须提前知道都有哪些策略模式类,才能自行决定当前场景该使用何种策略

背景:演示的demo 是以拉取短视频平台up主数据为背景,调用三方接口可能返回诸如:被限流、拉取数据失败、拉取数据次数超过每日上限等状态,而对于每种状态如果用 if else进行分支逻辑处理,一旦分支逻辑过多,代码会显得冗余且可读性较差,所以采用策略者模式进行代码优化。

1. 定义接口

/**
 * 数据状态服务
 */
public interface StatusService {
    // 状态处理方法
    void statusHandle(int statusCode);
}

2. 各种状态实现类

  • 被限流
/**
* 被限流
*/
public class CurrentLimitingStatusServiceImpl implements StatusService{
   @Override
   public void statusHandle(int statusCode) {
       // todo::被限流的业务逻辑
       System.out.println("拉取平台数据被限流,状态码:" + statusCode);
   }
}
  • 数据为空
/**
 * 数据为空
 */
public class DataNullStatusServiceImpl implements StatusService{
    @Override
    public void statusHandle(int statusCode) {
        // todo::拉取平台数据为空的业务逻辑
        System.out.println("拉取平台数据为空,状态码:" + statusCode);
    }
}
  • 超过每日拉取限制次数
/**
 * 超过每日拉取限制次数
 */
public class ExceedanceStatusServiceImpl implements StatusService {
    @Override
    public void statusHandle(int statusCode) {
        // todo::超过每日最大限制次数的业务逻辑
        System.out.println("拉取平台数据超过每日最大限制次数,状态码:" + statusCode);
    }
}
  • 拉取数据失败
/**
 * 拉取数据失败
 */
public class FailedStatusServiceImpl implements StatusService{
    @Override
    public void statusHandle(int statusCode) {
        // todo::拉取平台数据失败业务逻辑
        System.out.println("拉取平台数据失败,状态码:" + statusCode);
    }
}

  • 拉取数据成功
/**
 * 拉取数据成功
 */
public class SucceedStatusServiceImpl implements StatusService{
    @Override
    public void statusHandle(int statusCode) {
        // todo::拉取平台数据成功的业务逻辑
        System.out.println("拉取平台数据成功,状态码:" + statusCode);
    }
}

3. 定义枚举

public enum StatusType {

    CURRENT_LIMITING(10001, "被限流", new CurrentLimitingStatusServiceImpl()),
    DATA_NULL(10002, "数据为空", new DataNullStatusServiceImpl()),
    EXCEEDANCE(10003, "超过每日拉取限制次数", new ExceedanceStatusServiceImpl()),
    FAILED(10004, "拉取数据失败", new FailedStatusServiceImpl()),
    SUCCEED(10006, "拉取数据成功", new SucceedStatusServiceImpl());

    private final int code;
    private final String description;
    private final StatusService statusService;

    StatusType(int code, String description, StatusService statusService) {
        this.code = code;
        this.description = description;
        this.statusService = statusService;
    }

    public int getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }

    public StatusService getStatusService() {
        return statusService;
    }

    /**
     * 获取 StatusType
     *
     * @param code
     * @return
     */
    public static StatusType fromCode(Integer code) {
        return Arrays.stream(StatusType.values())
                .filter(c -> c.getCode() == code).findFirst()
                .orElse(null);
    }
}


4. 简单测试

public class TestUse {

    public static void main(String[] args) {

        // todo::通过http请求调用拉取平台数据,拿到返回的状态码

        // 这里就用自己造的状态码简单模拟下
        int statusCode = 10001;
        StatusType statusType = StatusType.fromCode(statusCode);
        if (null != statusType) {
            statusType.getStatusService().statusHandle(statusCode);
        }
    }
}

运行结果:

在这里插入图片描述

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 Spring Boot 中结合策略模式枚举设计支付可以按照以下步骤进行: 1. 定义支付方式的枚举:创建一个枚举类,用于表示不同的支付方式。例如: ```java public enum PaymentMethod { ALIPAY, WECHATPAY, BANKCARD } ``` 2. 定义策略接口和实现类:创建支付策略接口和具体的支付策略实现类。在接口中定义支付方法,实现类中实现具体的支付逻辑。例如: ```java public interface PaymentStrategy { void pay(BigDecimal amount); } @Component public class AlipayStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现支付宝支付逻辑 } } @Component public class WechatPayStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现微信支付逻辑 } } @Component public class BankCardStrategy implements PaymentStrategy { public void pay(BigDecimal amount) { // 实现银行卡支付逻辑 } } ``` 3. 创建支付策略工厂类:创建一个支付策略工厂类,用于获取正确的支付策略对象。根据传入的支付方式枚举值,返回对应的支付策略对象。例如: ```java @Component public class PaymentStrategyFactory { @Autowired private AlipayStrategy alipayStrategy; @Autowired private WechatPayStrategy wechatPayStrategy; @Autowired private BankCardStrategy bankCardStrategy; public PaymentStrategy getPaymentStrategy(PaymentMethod paymentMethod) { switch (paymentMethod) { case ALIPAY: return alipayStrategy; case WECHATPAY: return wechatPayStrategy; case BANKCARD: return bankCardStrategy; default: throw new IllegalArgumentException("Unsupported payment method: " + paymentMethod); } } } ``` 4. 在业务逻辑中使用支付策略:在需要使用支付功能的地方,通过支付策略工厂获取正确的支付策略对象,并调用支付方法进行支付。例如: ```java @Service public class PaymentService { @Autowired private PaymentStrategyFactory paymentStrategyFactory; public void processPayment(PaymentMethod paymentMethod, BigDecimal amount) { PaymentStrategy paymentStrategy = paymentStrategyFactory.getPaymentStrategy(paymentMethod); paymentStrategy.pay(amount); } } ``` 通过结合策略模式枚举设计支付,可以更加方便地管理和扩展支付方式,同时提高代码的可读性和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值