背景

项目中订单支付为常见的功能,一般的订单支付都会包含多种方式,例如聚合支付、会员支付、积分支付的等多种方式,如果采用传统的方式来实现,需要使用多个if/else条件判断,本文将介绍如何采用策略+工厂模式实现多种方式的订单支付问题。

简介

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

基本原理

基本元素组成如下:

  • 环境 (Context):持有一个策略类的引用,最终给客户端调用。
  • 抽象策略 (Strategy): 策略类,通常是一个接口或者抽象类。
  • 具体策略 (ConcreteStrategy):实现了策略类中的策略方法,封装相关的算法和行为。

具体实现

定义抽象策略

public interface PayWayService
{Result pay(WxPayObject wxpayObject);
}

说明:定义抽象支付接口。

具体策略

微信支付

@Component("wx")
public class WxPayWayServiceImpl implements PayWayService
{private Logger logger = LoggerFactory.getLogger(WxPayWayServiceImpl.class);@Overridepublic 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);@Overridepublic 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);@Overridepublic Result pay(WxPayObject wxpayObject){logger.info("this is member pay way");return Result.success(wxpayObject);}
}

工厂类

@Component
public class PayWayFactory
{@Autowiredprivate 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
{@Autowiredprivate PayWayFactory payWayFactory;@RequestMapping("/getPayWay")public void getPayWay(@RequestParam String payWay){WxPayObject wxpayObject =new WxPayObject();payWayFactory.getPayWayService(payWay).pay(wxpayObject);}
}

输入 payway分别输入wx和member输出结果如下:

策略模式优缺点

优点

  • 提供了管理相关的算法族的办法,从而避免重复的代码。
  • 提供了可以替换继承关系的办法。因为继承使得动态改变算法或行为变得不可能。
  • 可以避免使用多重条件转移语句。

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

总结

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

采用策略模式实现订单支付多种方式相关推荐

  1. 【设计模式实践系列】策略模式应用订单折扣方案

    策略模式 策略模式指的是一个类的行为或其算法可以在运行时更改,在不同的场景中,有不同的实现算法. 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情 ...

  2. 精讲23种设计模式-策略模式~聚合短信服务和聚合支付服务

    文章目录 一.设计模式 1. 为什么需要使用设计模式 2. 设计模式的分类 3. 什么是策略模式 4. 为什么叫做策略模式 5. 策略模式优缺点 6. 策略模式应用场景 7. Spring框架中使用的 ...

  3. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  4. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  5. 设计模式—策略模式(Strategy Pattern)

    上午花了一个小时看了这篇关于策略模式的博文,例子生动.内容具体.值得一看(http://www.uml.org.cn) .转发这篇微博,只为互相学习. 策略模式(Strategy) 1  场景问题 1 ...

  6. 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式

    前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...

  7. 策略模式(解决多重if判断问题)

    什么是策略模式? 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,最终可以实现解决多重if判断问题. 1.环境(Context)角色:持有一个Strategy的引用 ...

  8. 策略模式的理解与应用

    策略模式的理解 策略模式 什么是策略模式 策略模式的重点理解 简单代码示例 策略模式图解 策略模式的优势 策略模式的使用场景 总结 策略模式 什么是策略模式 策略模式(Strategy Pattern ...

  9. 【设计模式】 模式PK:策略模式VS状态模式

    1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...

最新文章

  1. mysql 的默认数据库mysql为什么在 workbench下看不到?
  2. 你真的会学习吗?从结构化思维说起
  3. 【已解决】R语言,在线升级
  4. 开源 | 如何实现一个iOS AOP框架?
  5. WiFi攻击中的“核武器”长啥样?来,今天咱们开开眼...
  6. 【解析】在设计软件的模块结构时,()不能改进设计质量
  7. 深度学习推荐模型-NFM
  8. 编译OpenJDK8:error: control reaches end of non-void function [-Werror=return-type]
  9. 单循环赛 贝格尔编排法实现
  10. could not find function 函数名
  11. 设置按峰值带宽计费_一个公式告诉你CDN适合带宽计费还是流量计费
  12. 2018中国民营企业500强榜单
  13. 微信小程序客服介绍:如何设置小程序在线客服?
  14. 微信扫码支付dome php,帝国cms 微信扫码支付 模式二 扫码付款demo
  15. VsCode新建VueJs项目的详细步骤
  16. Mac显示/隐藏文件夹
  17. 关于计算机方面的知识小故事,「计算机小故事」-奇妙的HelloWorld任务
  18. 房源管理系统php,房产中介房源管理系统 v1.1
  19. 页面组成、表格、博客、图片、列表
  20. 通过棘轮轻松实现原型移动应用程序

热门文章

  1. Java逐行读取fasta文件
  2. YOLOv1论文中英文对照翻译
  3. 【Little Demo】从简单的Tab标签到Tab图片切换
  4. 用Notepad++ 宏功能 将json数据转换为EXCEL
  5. TextSeek使用教程(初级篇) - 文件搜索软件
  6. python怎么选取不连续的列_python – Pandas从数据帧中选择不连续的列
  7. 秦曾昌人工智能课程---1、机器学习中的数学基础
  8. 软件加入使用时间_【安卓】换了这么多影视软件,还是这个老牌站点最靠谱
  9. python循环3次停止_【Python】quot;为所欲为quot;怎么成语接龙?
  10. 裁员潮,带给我的思考