项目中订单支付为常见的功能,一般的订单支付都会包含多种方式,例如聚合支付、会员支付、积分支付的等多种方式,如果采用传统的方式来实现,需要使用多个if/else条件判断,本文将介绍如何采用策略+工厂模式实现多种方式的订单支付问题。
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

基本元素组成如下:
- public interface PayWayService
- {
- Result pay(WxPayObject wxpayObject);
- }
-
说明:定义抽象支付接口。
- @Component("wx")
- public class WxPayWayServiceImpl implements PayWayService
- {
- private Logger logger =
- LoggerFactory.getLogger(WxPayWayServiceImpl.class);
-
- @Override
- public Result pay(WxPayObject wxPayObject)
- {
- logger.info("this is wx pay way");
- return Result.success(wxPayObject);
- }
- }
-
说明:注意@Component注解需要写入别名。
- @Component("zfb")
- public class ZfbPayWayServiceImpl implements PayWayService
- {
- private Logger logger =
- LoggerFactory.getLogger(ZfbPayWayServiceImpl.class);
-
- @Override
- public Result pay(WxPayObject wxpayObject)
- {
- logger.info("this is zfb pay way");
- return Result.success(wxpayObject);
- }
- }
-
- @Component("member")
- public class MemberPayWayServiceImpl implements PayWayService
- {
- private Logger logger =
- LoggerFactory.getLogger(MemberPayWayServiceImpl.class);
-
- @Override
- public Result pay(WxPayObject wxpayObject)
- {
- logger.info("this is member pay way");
- return Result.success(wxpayObject);
- }
- }
-
- @Component
- public class PayWayFactory
- {
- @Autowired
- private Map<String, PayWayService> paywayServiceMap;
-
- public PayWayService getPayWayService(String type)
- {
- PayWayService payWayService = paywayServiceMap.get(type);
- if(payWayService==null)
- {
- throw new RuntimeException("未指定的支付类型");
- }
- return payWayService;
- }
- }
-
说明:通过工厂类获取具体的策略实现。
- private Map<String, PayWayService> paywayServiceMap
-
@Autowired 标注作用于Map类型时,如果Map的key为String类型,则Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来,用 Bean 的 iD 或 name 作为Map的key。
- @RestController
- public class TestController
- {
- @Autowired
- private PayWayFactory payWayFactory;
-
- @RequestMapping("/getPayWay")
- public void getPayWay(@RequestParam String payWay)
- {
- WxPayObject wxpayObject =new WxPayObject();
- payWayFactory.getPayWayService(payWay).pay(wxpayObject);
- }
- }
-
输入 payway分别输入wx和member输出结果如下:

本文对策略模式进行了讲解,策略模式在实际开发过程中应用的比较广泛,所以大家还是需要熟练的掌握其用法,如有疑问,请随时反馈。