Java设计模式——策略模式(解决满屏的if/else)
一、业务场景
项目需要对接支付系统,根据不同客户类型会有不同的支付方式,比如:支付宝、微信、银联、云闪付等等其他第三方支付平台,这个时候策略模式就大展身手了。
传统的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是不可能的,不能过度设计,不能为了使用设计模式而使用设计模式。
策略模式的优点:
- 干掉繁琐的if、switch判断逻辑;
- 代码优雅、可服用、可读性好;
- 符合开闭原则、扩展性好、便于维护;
策略模式的缺点:
- 策略如果很多的话,会造成策略类膨胀;
- 使用者必须清楚所有的策略类及其用途;
Java设计模式——策略模式(解决满屏的if/else)相关推荐
- Java设计模式-策略模式作业
Java设计模式-策略模式作业,所有类和接口均在一个package内 文章目录 前言 一.作业内容 二.具体实现 1.类图 2.Strategy接口 3.PreCopyStrategy类 4.Post ...
- java设计模式---策略模式
1,什么是策略模式? 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 2,策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象 ...
- JAVA设计模式-策略模式
1.1 需求背景 Background:M公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下: (1)学生凭学生证可享受票价8折优惠: (2 ...
- Java设计模式--策略模式
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合 策略模式就是用来封装算法的, ...
- Java设计模式策略模式(附实例代码)每天一学设计模式
1.策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换.策略模式让算法可以独立于使用它的客户而变化. (1)Context(环境类):环境类是使用 ...
- 小故事说JAVA设计模式-策略模式【Strategy Pattern】
# 弄清概念 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化 # 策略模式 ...
- Java设计模式-策略模式(Strategy)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.策略模式 二.策略模式示例代码 1.支付策略 2.具体支付策略实现 3.策略执行对象 4.测试 总结 前言 本篇介 ...
- Java设计模式----策略模式(Strategy)
1. 策略模式: 策略模式,也称为政策模式,定义如下: 定义一组算法,将每个算法都封装起来,使他们可以相互转化 2. 策略模式的原理是面向对象的继承和多态.策略模式的3个角色 a. Strateg ...
- Java设计模式-策略模式(一)
一.策略模式是什么? 策略模式是指有一定行动内容的相对稳定的策略名称.策略模式在古代中又称"计策",简称"计",如<汉书·高帝纪上>:"汉 ...
最新文章
- WCF 和 ASP.NET Web API
- pandas使用date_range函数按照指定的频率(freq)和指定的个数(periods)生成dataframe的时间格式数据列、基于dataframe的日期数据列生成日期索引
- 定时自动按键软件_[按键精灵手机版教程]QUI界面也可以如此炫酷
- 【树莓派】为树莓派配置或扩展swap分区
- 安防行业标准规范大全
- JavaScript创建命名空间
- Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法
- Web报表工具FineReport二次开发JS之字符串
- C#之判断Mysql数据库是否存在
- php 获取客户端的ip、地理信息、浏览器信息、本地真实ip
- 【车道线检测】基于matlab Hough变换视频车道线检测 【含Matlab源码 274期】
- 【持续更新】最小生成树题目集合
- linux自动挂载ipsan,RedhatLinux挂载IPSAN(iScsi协议)
- UART 协议以及概念
- SOC堡垒机运维管理平台
- 中文菜单的html编辑器,如何更改IE查看源代码菜单使用的HTML编辑器
- 使用Centos7部署静态网站
- python3中aiohttp+asyncio 高效率爬取图片例子,本地保存
- VMwareWorkstation虚拟机安装Linux系统
- Bugzilla使用说明