一、业务场景

项目需要对接支付系统,根据不同客户类型会有不同的支付方式,比如:支付宝、微信、银联、云闪付等等其他第三方支付平台,这个时候策略模式就大展身手了。

传统的if/else/switch 等等判断的写法太low了,代码糅合在一块,维护也不方便。

二、简单代码示例

1、实体类准备

订单信息类

package com.iot.designpattern.strategy.model;import lombok.Data;
import lombok.experimental.Accessors;/*** 订单信息** @author Mr.Qu* @since 2021/5/18 10:56*/
@Data
@Accessors(chain = true)
public class Order {/*** 金额*/private int amount;/*** 支付类型*/private String type;
}

返回结果类

package com.iot.designpattern.strategy.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 支付结果** @author Mr.Qu* @since 2021/5/18 10:59*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PayResult {/*** 响应码*/private int code;/*** 提示信息*/private String msg;public static PayResult success(String msg) {return new PayResult(200, msg);}
}

2、定义策略接口(所有支付方式的接口),策略接口如下:

package com.iot.designpattern.strategy.service;import com.iot.designpattern.strategy.model.Order;
import com.iot.designpattern.strategy.model.PayResult;/*** 支付接口** @author Mr.Qu* @since 2021/5/18 10:52*/
public interface IPayment {/*** 支付** @param order 订单信息* @return PayResult 支付结果*/PayResult pay(Order order);
}

3、定义各种策略实现类

支付宝支付实现类:

package com.iot.designpattern.strategy.service.Impl;import com.iot.designpattern.strategy.model.Order;
import com.iot.designpattern.strategy.model.PayResult;
import com.iot.designpattern.strategy.service.IPayment;
import org.springframework.stereotype.Service;/*** 支付宝支付** @author Mr.Qu* @since 2021/5/18 11:08*/
@Service
public class AliPay implements IPayment {@Overridepublic PayResult pay(Order order) {return new PayResult(200, "支付宝支付成功");}
}

微信支付实现类:

package com.iot.designpattern.strategy.service.Impl;import com.iot.designpattern.strategy.model.Order;
import com.iot.designpattern.strategy.model.PayResult;
import com.iot.designpattern.strategy.service.IPayment;
import org.springframework.stereotype.Service;/*** 微信支付** @author Mr.Qu* @since 2021/5/18 10:58*/
@Service
public class WechatPay implements IPayment {@Overridepublic PayResult pay(Order order) {return new PayResult(200, "微信支付成功");}
}

银联支付实现类:

package com.iot.designpattern.strategy.service.Impl;import com.iot.designpattern.strategy.model.Order;
import com.iot.designpattern.strategy.model.PayResult;
import com.iot.designpattern.strategy.service.IPayment;
import org.springframework.stereotype.Service;/*** 银联支付** @author Mr.Qu* @since 2021/5/18 11:10*/
@Service
public class UnionPay implements IPayment {@Overridepublic PayResult pay(Order order) {System.out.println("开始银联支付");return PayResult.success("银联支付成功");}
}

注:通过@Service注解将支付实现类注入spring工厂管理,默认bean名字是类名(开头小写)

4、使用策略

package com.iot.designpattern.strategy.controller;import com.iot.designpattern.strategy.model.Order;
import com.iot.designpattern.strategy.model.PayResult;
import com.iot.designpattern.strategy.service.IPayment;
import lombok.AllArgsConstructor;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** 支付** @author Mr.Qu* @since 2021/5/18 15:30*/
@RestController
@AllArgsConstructor
@RequestMapping("/pay/")
public class PayController {private final ApplicationContext applicationContext;/*** 支付API** @param amount  金额* @param payType 支付类型* @return PayResult*/@GetMapping()public PayResult pay(int amount, String payType) {Order order = new Order().setAmount(amount).setType(payType);//  根据【支付类型】获取对应的策略 beanIPayment payment = applicationContext.getBean(payType, IPayment.class);//  开始调用策略对应的支付业务逻辑return payment.pay(order);}
}

5、测试一下:

注:在调用的时候,注意payType中值为@Service对应的类名(开头小写),也可以自己在注解中命名name

三、总结

使用策略模式,我们可以干掉大量的if/else,代码也更优雅,还能灵活扩展。像本文中的支付案例,后面如果有别的支付方式,我们只需要写一个新的对应支付实现类即可,无需修改现有代码。

当然,完全干掉if/else是不可能的,不能过度设计,不能为了使用设计模式而使用设计模式。

策略模式的优点:

  1. 干掉繁琐的if、switch判断逻辑;
  2. 代码优雅、可服用、可读性好;
  3. 符合开闭原则、扩展性好、便于维护;

策略模式的缺点:

  1. 策略如果很多的话,会造成策略类膨胀;
  2. 使用者必须清楚所有的策略类及其用途;

Java设计模式——策略模式(解决满屏的if/else)相关推荐

  1. Java设计模式-策略模式作业

    Java设计模式-策略模式作业,所有类和接口均在一个package内 文章目录 前言 一.作业内容 二.具体实现 1.类图 2.Strategy接口 3.PreCopyStrategy类 4.Post ...

  2. java设计模式---策略模式

    1,什么是策略模式? 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 2,策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象 ...

  3. JAVA设计模式-策略模式

    1.1 需求背景 Background:M公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下: (1)学生凭学生证可享受票价8折优惠: (2 ...

  4. Java设计模式--策略模式

    策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合 策略模式就是用来封装算法的, ...

  5. Java设计模式策略模式(附实例代码)每天一学设计模式

    1.策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换.策略模式让算法可以独立于使用它的客户而变化. (1)Context(环境类):环境类是使用 ...

  6. 小故事说JAVA设计模式-策略模式【Strategy Pattern】

    # 弄清概念 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化 # 策略模式 ...

  7. Java设计模式-策略模式(Strategy)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...

  8. Java设计模式----策略模式(Strategy)

    1.  策略模式: 策略模式,也称为政策模式,定义如下: 定义一组算法,将每个算法都封装起来,使他们可以相互转化 2.  策略模式的原理是面向对象的继承和多态.策略模式的3个角色 a. Strateg ...

  9. Java设计模式-策略模式(一)

    一.策略模式是什么? 策略模式是指有一定行动内容的相对稳定的策略名称.策略模式在古代中又称"计策",简称"计",如<汉书·高帝纪上>:"汉 ...

最新文章

  1. WCF 和 ASP.NET Web API
  2. pandas使用date_range函数按照指定的频率(freq)和指定的个数(periods)生成dataframe的时间格式数据列、基于dataframe的日期数据列生成日期索引
  3. 定时自动按键软件_[按键精灵手机版教程]QUI界面也可以如此炫酷
  4. 【树莓派】为树莓派配置或扩展swap分区
  5. 安防行业标准规范大全
  6. JavaScript创建命名空间
  7. Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法
  8. Web报表工具FineReport二次开发JS之字符串
  9. C#之判断Mysql数据库是否存在
  10. php 获取客户端的ip、地理信息、浏览器信息、本地真实ip
  11. 【车道线检测】基于matlab Hough变换视频车道线检测 【含Matlab源码 274期】
  12. 【持续更新】最小生成树题目集合
  13. linux自动挂载ipsan,RedhatLinux挂载IPSAN(iScsi协议)
  14. UART 协议以及概念
  15. SOC堡垒机运维管理平台
  16. 中文菜单的html编辑器,如何更改IE查看源代码菜单使用的HTML编辑器
  17. 使用Centos7部署静态网站
  18. python3中aiohttp+asyncio 高效率爬取图片例子,本地保存
  19. VMwareWorkstation虚拟机安装Linux系统
  20. Bugzilla使用说明

热门文章

  1. linux软件逆向分析,详解对ELF64之手动脱壳的逆向分析
  2. 【DB笔试面试614】在Oracle中,和视图相关的查询转换有哪些?
  3. 【计算机组成原理】第三章 存储系统
  4. 使用nitro快速搭建js服务器
  5. 【转】像特斯拉创始人一样思考
  6. 【jQuery】前端项目实践案例1——使用jQuery制作Tab选项卡点击切换效果
  7. 中国茂金属聚乙烯(mPE)行业研究报告(2022版)
  8. 我想有个用得上的智能路由器
  9. 【面试必会】苦逼程序猿拿头发换生活,深度好文
  10. 在计算机潮流计算的三类节点中,国家电网校园招聘考试电力系统分析真题填空题...