基于springboot的策略模式
模块说明
本项目是一个策略模式的案例demo。网上有很多的关于策略模式的例子,这里直接写一下,最简单的使用。
策略模式的思想
比如说对象的某个行为,在不同场景中有不同的实现方式,这样就可以将这些实现方式定义成一组策略,每个实现类对应一个策略,在不同的场景就使用不同的实现类,并且可以自由切换策略。基本就是利用一些简单的策略算法来实现。
策略模式的优点:
1、干掉繁琐的 if、switch 判断逻辑;
2、代码优雅、可复用、可读性好;
3、符合开闭原则,扩展性好、便于维护;
4、符合开闭原则;
策略模式的缺点:
1、策略如果很多的话,会造成策略类膨胀;
2、使用者必须清楚所有的策略类及其用途;
开始写一下代码
这里介绍一下写的demo,主要是结合实际情况。现在生活中有很多种支付方式,比如我们去超市买东西,会用手机去扫码支付,一般常用的就是微信、支付宝、云闪付等。
一、定义一个总的策略接口
/**
* @Author Summer_DM
* @Summary TODO 定义一个支付的公共父级接口
* @Version 1.0
* @Date 2021/9/9 上午 09:52
**/
public interface IPayment {
/**
* 支付
* @param order
* @return
*/
PayResult pay(Order order);
}
二、定义一个订单实体、一个返回结果封装体
/**
* @Author Summer_DM
* @Summary TODO 支付订单类
* @Version 1.0
* @Date 2021/9/9 上午 09:55
**/
@Data
public class Order {
/**
* 金额
*/
private int amount;
/**
* 支付类型
*/
private String paymentType;
}
/**
* @Author Summer_DM
* @Summary TODO 返回结果类
* @Version 1.0
* @Date 2021/9/9 上午 09:54
**/
@Data
@AllArgsConstructor
public class PayResult {
/**
* 支付结果
*/
private String result;
}
三、定义几个实现的策略结果,去实现策略
/**
* @Author Summer_DM
* @Summary TODO 支付宝支付,需要实现支付的接口
* @Version 1.0
* @Date 2021/9/9 上午 09:58
**/
@Service("Alipay")
public class Alipay implements IPayment {
/**
* 支付
*
* @param order
* @return
*/
@Override
public PayResult pay(Order order) {
return new PayResult("支付宝支付成功");
}
}
/**
* @Author Summer_DM
* @Summary TODO 云闪付支付,需要实现支付的接口
* @Version 1.0
* @Date 2021/9/9 上午 09:59
**/
@Service("UnionPay")
public class UnionPay implements IPayment {
/**
* 支付
*
* @param order
* @return
*/
@Override
public PayResult pay(Order order) {
return new PayResult("云闪付支付成功");
}
}
/**
* @Author Summer_DM
* @Summary TODO 微信支付,需要实现支付的接口
* @Version 1.0
* @Date 2021/9/9 上午 09:56
**/
@Service("WechatPay")
public class WechatPay implements IPayment {
/**
* 支付
*
* @param order
* @return
*/
@Override
public PayResult pay(Order order) {
return new PayResult("微信支付成功");
}
}
四、最后前端调用
/**
* @Author Summer_DM
* @Summary TODO 外部调用接口
* @Version 1.0
* @Date 2021/9/9 上午 10:01
**/
@RestController
@RequestMapping("/pay")
public class PayController {
@Autowired
private ApplicationContext applicationContext;
/**
* 支付接口
* @param amount
* @param paymentType
* @return
*/
@RequestMapping("/toPay")
public PayResult pay(@RequestParam("amount") int amount,
@RequestParam("paymentType") String paymentType) {
Order order = new Order();
order.setAmount(amount);
order.setPaymentType(paymentType);
// 根据支付类型获取对应的策略 bean
IPayment payment = applicationContext.getBean(order.getPaymentType(), IPayment.class);
// 开始支付
PayResult payResult = payment.pay(order);
return payResult;
}
}
五、使用postman或者浏览器测试
以前的 策略模式很多都是自己去实现一个context来统一给前端调用,本篇文章写的是基于springboot去管理的,所以,这里直接调用ApplicationContext去getBean(),就可以获取到一个context,当然一定不能忘了在策略实现逻辑那块的@service(“类名”),必须把这个con他凶恶交给spring去管理,我们在调用时,才可以获取到Bean.
以上就是所有的实现,基于springboot,特别简单,一看就懂,写下来,只是为了自己学习和帮助有需要的人。