项目推荐
最近开发完成的项目中使用到了策略模式,实现多种支付方式,避免了后期支付方式if-else代码的冗余,也有利于后期支付的一个扩展。同时这个项目非常适合于做毕设,想了解这个项目的同学可以联系我QQ:3808898981
前台首页
后台管理员
后台商户端
什么是策略模式呢?
策略模式(Strategy Design Pattern),定义一堆算法类,并将每个算法分别封装起来,让它们可以互相替换,被封装起来的算法具有独立性外部不可改变其特性。
策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。
策略模式的应用场景 策略模式最常见的应用场景是,利用它来避免冗长的 if-else 或 switch 分支判断。不过,它的作用还不止如此。它也可以像模板模式那样,提供框架的扩展点等等。
当我们需要多个功能相似的类,并且需要它们之间可以灵活切换时,就非常适合使用策略模式。
策略模式的构成 策略类的定义比较简单,需要定义以下两种角色:
-
抽象策略接口类:定义了策略类需要实现的方法规范。
-
策略实现类:继承自抽象策略接口,为具体策略类。
-
当有多个策略时,可以通过简单工厂封装所有的策略,使调用更加易用:
策略工厂类:一般来说,通过一个策略工厂,将一群功能相同的策略封装起来,调用更加方便。 通过一个文件处理的例子来说明;有一个文件处理的通用类,可以处理excel、txt、exe文件。 面对不同类型的文件,返回具体对应的文件处理类,也就是具体的策略类。
实战
支付实体类
/**
* @Author: @weixueshi
* @Create: 2023/12/31 - 11:03
* @Version: v1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Pay implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 订单号
*/
private String orderId;
/**
* 商品名称
*/
private String name;
/**
* 商品金额
*/
private String price;
/**
* 支付方式
*/
private String paymentType;
}
定义一个顶级支付接口
public interface PayStrategy {
/**
* 支付接口
* @param pay
* @return
*/
Response pay(Pay pay);
}
定义两个具体实现类:支付宝和微信支付
/**
* @Author: @weixueshi
* @Create: 2024/3/14 - 14:48
* @Version: v1.0
*/
/**
* 支付宝支付具体实现
*/
@Slf4j
@Component
public class AlipayStrategyImpl implements PayStrategy{
@Override
public Response pay(Pay pay) {
//支付的具体处理逻辑
log.info("我是支付宝支付------");
return Response.success();
}
}
/**
*
* @Author: @weixueshi
* @Create: 2024/3/14 - 14:49
* @Version: v1.0
*/
/**
* 微信支付具体实现
*/
@Slf4j
@Component
public class WechatPayStrategyImpl implements PayStrategy {
@Override
public Response pay(Pay pay) {
//支付的具体处理逻辑
log.info("我是微信支付------");
return Response.success();
}
}
定义一个调用支付的服务类
/**
* @Author: @weixueshi
* @Create: 2024/3/14 - 14:50
* @Version: v1.0
*/
/**
* 创建支付服务类,根据用户选择的支付方式创建对应的策略对象并执行支付操作:
*/
@Service("payService")
public class PayService {
private Map<String, PayStrategy> payStrategyMap = new HashMap<String, PayStrategy>();
public PayService() {
// 将支付宝和微信支付策略对象放入Map中
payStrategyMap.put("alipay",new AlipayStrategyImpl());
payStrategyMap.put("wechat",new WechatPayStrategyImpl());
}
public Response pay(Pay pay) {
// 根据用户选择的支付方式获取对应的策略对象
PayStrategy payStrategy = payStrategyMap.get(pay.getPaymentType());
if (payStrategy == null) {
throw new ServiceException("支付方式不支持");
}
// 执行支付操作
return payStrategy.pay(pay);
}
}
最后在controller层调用支付
@Slf4j
@CrossOrigin
@RestController
@RequiredArgsConstructor
public class OrderPayController {
private final PayService payService;
/**
* 支付接口
* @return
*/
@PostMapping("/common")
public Response commonPay(@RequestBody Pay pay){
log.info("{}支付请求进来了-----------",pay.getPaymentType());
return payService.pay(pay);
}
}
到此使用策略模式实现多种支付就已完成!