巧用Java策略模式取代 if else

一、背景

近期在项目维护中发现了一个三千余行代码的 java文件,其功能主要就是针对不同的类型需要进行不同的业务处理,原本的实现就是使用传统的 if else 形式实现的,不是说这种实现方式不对,而是当我看到每个分支里面有五六百行代码时,我下定决定开始改造它!

二、策略模式

策略模式是 Java里面设计模式的一种,即允许我们将一系列算法进行封装,以便在不同情况下可以选择不同的算法来实现特定的行为,在这个模式中,主要参与者包括:

  1. 上下文(Context):它包含了用于设置和管理策略的对象,并向客户端提供了一种获取策略的接口。
  2. 策略(Strategy):这是一种接口或抽象类,定义了算法的基本契约,即所有策略类都必须遵循的公共方法。
  3. 具体策略(Concrete Strategies):这些是实现策略接口的具体类,每个具体策略代表一组算法的一个实现版本。

策略模式的核心思想是将算法的实现从使用它的客户端代码中解耦出来,使得算法的选择可以在运行时动态地进行,从而提高代码的可维护性和扩展性。此外,策略模式可以帮助避免重复编写逻辑相同的代码块,简化程序结构,使其更易于理解和维护。

三、快速上手

由于涉及公司业务,真实代码不便放出,下面将以支付场景做一个简单的例子

需求:电子支付现在已经是没人个日常生活中不可或缺的一部分了,现在需要开发一个支付系统,适配各类支付,相支付宝、微信、云闪付等等

1.创建一个支付通用服务接口

public interface PayService {

    void payload();
}

2.支付宝支付实现

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service("ali-pay")
@Slf4j
public class AliPayServiceImpl implements PayService {
    @Override
    public void payload() {
        log.info("支付宝支付");
        // 支付宝支付的处理逻辑 ...
    }
}

3.微信支付实现

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service("wx-pay")
@Slf4j
public class WxPayServiceImpl implements PayService {
    @Override
    public void payload() {
        log.info("微信支付处理逻辑");
        // 微信支付的处理逻辑 ...
    }
}

4.方法调用

import com.example.mqtest.tactics.PayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.Map;

@Slf4j
@RestController
public class PayController {

    @Resource
    Map payServiceMap;

    @GetMapping("/pay/{payType}")
    public String pay(@PathVariable("payType") String payType) {
        if(payServiceMap.containsKey(payType)) {
            return payServiceMap.get(payType).payload();
        }
        return "payType not supported";
    }
}

5.调用结果

 
  

巧用Java策略模式取代 if else_第1张图片

巧用Java策略模式取代 if else_第2张图片

四、总结

策略模式可以将分类细分到不同的类进行处理,有较高代码可读性和可维护性,但也不是所有场景都适用,对于一些简单的分支处理,使用 if else 就完全可以解决,这种情况下强行使用策略模式反而适得其反,增加的工作量,所以还是需要结合业务场景做选择。

你可能感兴趣的:(java,策略模式,开发语言)