写在开始:一个搬砖程序员的随缘记录
一、前言
在日常的需求中,难免会遇到各种奇奇怪怪的需求,需要各种if else进行实现,但是如果我们使用if else进行实现,一是代码量比较多,二是可维护性比较不强,特别是改别人的代码
业务场景:
通过支付宝、微信、银行卡三种方式进行支付,后期可能会增加其他的支付方式
只是以这个为例子,不一定支付场景就需要使用模式来进行实现
二、if else方式实现
Integer paymentType = 1;
if (paymentType == 1) {
System.out.println("支付宝支付");
} else if (paymentType == 2) {
System.out.println("微信支付");
} else if (paymentType == 3) {
System.out.println("银行卡支付");
}
看起来例子是比较简单,但是可能会有更复杂的场景,只是以这个为例子进行举例,能够通俗易懂
三、策略模式
1、策略接口
定义一个策略接口
UserPaymentService
@Component
public interface UserPaymentService {
/**
* 各种支付方式支付
*
* @return java.lang.String
* @author demo
* @since 2023/10/25
*/
String payment();
}
2、策略接口实现,3种支付方式
支付宝
@Service
public class AlipayPaymentServiceImpl implements UserPaymentService {
@Override
public String payment() {
// 具体逻辑
return "支付宝支付";
}
}
微信支付
@Service
public class WechatPaymentServiceImpl implements UserPaymentService {
@Override
public String payment() {
// 具体逻辑
return "微信支付";
}
}
银行卡支付
@Service
public class BankCardPaymentServiceImpl implements UserPaymentService {
@Override
public String payment() {
// 具体逻辑
return "银行卡支付";
}
}
四、工厂模式
1、工厂
工厂类 UserPaymentFactory
@Component
public class UserPaymentFactory {
@Autowired
private Map<String, UserPaymentService> paymentServiceMap = new ConcurrentHashMap<>();
public UserPaymentService getPayment(Integer paymentType) {
String serviceName = UserPaymentStrategyTypeEnum.getServiceName(paymentType);
return paymentServiceMap.get(serviceName);
}
}
Spring 会自动将 UserPaymentService接口的实现类注入到这个Map中。需要你这个类得交给Spring 容器进行管理
2、枚举类
枚举进行策略实现类的管理
@Getter
@AllArgsConstructor
public enum UserPaymentStrategyTypeEnum {
/**
* 支付宝支付
*/
ALIPAY(1, "支付宝支付", "alipayPaymentServiceImpl"),
/**
* 微信支付
*/
WECHAT(2, "微信支付", "wechatPaymentServiceImpl"),
/**
* 银行卡支付
*/
BANK_CARD(3, "银行卡支付", "bankCardPaymentServiceImpl");
private final Integer code;
private final String desc;
private final String strategyService;
/**
* 获取strategyService
*
* @param code code
* @return java.lang.String
* @author demo
* @since 2023/10/25
*/
public static String getServiceName(Integer code){
for (UserPaymentStrategyTypeEnum en : values()) {
if (en.getCode().equals(code)) {
return en.getStrategyService();
}
}
return "";
}
}
重点
重点
重点
枚举中的strategyService就是对应Spring管理对应的值,strategyService对应的枚举值就是你策略实现类的名字,小写打头
五、效果
写了一个Controller进行调用
@RestController
public class StrategyController {
@Autowired
private UserPaymentFactory userPaymentFactory;
/**
* 获取支付方式
*
* @param paymentType paymentType
* @return java.lang.String
* @author demo
* @since 2023/10/25
*/
@GetMapping("/getPaymentType")
public String demoController(@RequestParam("paymentType") Integer paymentType) {
return userPaymentFactory.getPayment(paymentType).payment();
}
}
效果:
Over