fix:支付模块

上级 7d4f04f2
# 设计模式学习 # 设计模式学习
# 后期转移到 模块里面去 不转也可以 ### 策略模式+工厂模式+门面模式 实现动态支付
\ No newline at end of file /Users/qinyingjie/Documents/idea-workspace/study/design/src/main/java/com/study/design/pay
\ No newline at end of file
...@@ -8,8 +8,15 @@ import com.study.design.pay.strategyContext.PayContext; ...@@ -8,8 +8,15 @@ import com.study.design.pay.strategyContext.PayContext;
import com.study.design.pay.strategyEnum.StrategyEnum; import com.study.design.pay.strategyEnum.StrategyEnum;
import com.study.design.pay.factory.StrategyFactory; import com.study.design.pay.factory.StrategyFactory;
// 最终我们只暴露我们的门面,对于里边的这些所有的工厂。策略啊。策略枚举啊,统统不暴露。
// 门面就是我们的超强封装。 /**
* 最终我们只暴露我们的门面,对于里边的这些所有的工厂。策略啊。策略枚举啊,统统不暴露。
* 门面就是我们的超强封装。
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:22
*/
public class StrategyFacade { public class StrategyFacade {
// 定义一个map,将对应关系提前初始化好。 // 定义一个map,将对应关系提前初始化好。
// 双十一的时候,有大量的用户进行下单(千万级),就会造成千万级的pay接口的调用。 // 双十一的时候,有大量的用户进行下单(千万级),就会造成千万级的pay接口的调用。
...@@ -25,7 +32,7 @@ public class StrategyFacade { ...@@ -25,7 +32,7 @@ public class StrategyFacade {
public static Boolean pay(PayBody payBody) { public static Boolean pay(PayBody payBody) {
//获取我们的 策略枚举 //获取我们的 策略枚举
StrategyEnum strategyEnum = getStrategyEnum(payBody.getType()); StrategyEnum strategyEnum = getStrategyEnum(payBody.getType());
if(strategyEnum == null) { if (strategyEnum == null) {
return false; return false;
} }
//获取我们的策略对象 //获取我们的策略对象
......
...@@ -7,6 +7,14 @@ import com.study.design.pay.strategyContext.PayContext; ...@@ -7,6 +7,14 @@ import com.study.design.pay.strategyContext.PayContext;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/**
* 工厂类
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:11
*/
public class AddFuncFactory { public class AddFuncFactory {
// 工厂的目的是生产 AddFuncDecorator; 生产几个啊? 多个:享元 // 工厂的目的是生产 AddFuncDecorator; 生产几个啊? 多个:享元
// key 应该是能够和 AbstractAddFuncDecorator 做成对应的东西。 // key 应该是能够和 AbstractAddFuncDecorator 做成对应的东西。
...@@ -14,7 +22,7 @@ public class AddFuncFactory { ...@@ -14,7 +22,7 @@ public class AddFuncFactory {
public final static Map<PayContext, AbstractAddFuncDecorator> maps = new ConcurrentHashMap<>(); public final static Map<PayContext, AbstractAddFuncDecorator> maps = new ConcurrentHashMap<>();
public static AbstractAddFuncDecorator getAddFunc(PayContext payContext) { public static AbstractAddFuncDecorator getAddFunc(PayContext payContext) {
if(maps.get(payContext) == null) { if (maps.get(payContext) == null) {
AddFuncDecorator addFuncDecorator = new AddFuncDecorator(payContext); AddFuncDecorator addFuncDecorator = new AddFuncDecorator(payContext);
maps.put(payContext, addFuncDecorator); maps.put(payContext, addFuncDecorator);
} }
......
...@@ -7,7 +7,7 @@ import java.util.Map; ...@@ -7,7 +7,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* 我们的工厂类依靠我们的策略枚举返回策略类 * 工厂类依靠我们的策略枚举返回策略类
* 我们以后永远不需要修改我们的Factory。他是一个无状态的 * 我们以后永远不需要修改我们的Factory。他是一个无状态的
* *
* @author : qinyingjie * @author : qinyingjie
...@@ -15,10 +15,17 @@ import java.util.concurrent.ConcurrentHashMap; ...@@ -15,10 +15,17 @@ import java.util.concurrent.ConcurrentHashMap;
* @date : 2022/9/27 02:21 * @date : 2022/9/27 02:21
*/ */
public class StrategyFactory { public class StrategyFactory {
//那个时候我们 引出他是为了讲解 单例模式,其实那个时候我们已经利用了单例模式
//思想升级之后的享元,模式了。 //思想升级之后的享元,模式了。
private static final Map<String, PayStrategy> strategyMaps = new ConcurrentHashMap(); private static final Map<String, PayStrategy> strategyMaps = new ConcurrentHashMap();
/**
* 通过枚举获取支付策略
*
* @param strategyEnum
* @return
*/
public static PayStrategy getPayStrategy(StrategyEnum strategyEnum) { public static PayStrategy getPayStrategy(StrategyEnum strategyEnum) {
PayStrategy payStrategy = strategyMaps.get(strategyEnum.getValue()); PayStrategy payStrategy = strategyMaps.get(strategyEnum.getValue());
...@@ -35,5 +42,5 @@ public class StrategyFactory { ...@@ -35,5 +42,5 @@ public class StrategyFactory {
} }
// 工厂模式的变种比较多。虽然这里边我写了一个 有静态方法的 工厂类,但是要与我们平时 // 工厂模式的变种比较多。虽然这里边我写了一个 有静态方法的 工厂类,但是要与我们平时
//写的 utils 类进行区分,utils 是以功能(生成uuid,日期转化)为导向的工具类。 //写的 utils 类进行区分,utils 是以功能(生成uuid,日期转化)为导向的工具类。
// 而 我写的factory类,他是以产出(一类行为类:策略)为导向的 // 而factory类,他是以产出(一类行为类:策略)为导向的
} }
package com.study.design.pay.pojo; package com.study.design.pay.pojo;
/**
* 支付实体类
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:10
*/
public class PayBody { public class PayBody {
/**
*支付账户
*/
private String account; private String account;
/**
*支付类型
*/
private int type; private int type;
/**
*支付产品
*/
private String product; private String product;
/**
*支付金额
*/
private int amount; private int amount;
public String getAccount() { public String getAccount() {
......
...@@ -3,6 +3,13 @@ package com.study.design.pay.proxy; ...@@ -3,6 +3,13 @@ package com.study.design.pay.proxy;
import com.study.design.pay.pojo.PayBody; import com.study.design.pay.pojo.PayBody;
import com.study.design.pay.strategyContext.AbstractPayContext; import com.study.design.pay.strategyContext.AbstractPayContext;
/**
* 抽象AbstractPayContext代理类
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:09
*/
public class ContextProxy extends AbstractPayContext { public class ContextProxy extends AbstractPayContext {
private AbstractPayContext abstractPayContext = null; private AbstractPayContext abstractPayContext = null;
......
...@@ -2,7 +2,15 @@ package com.study.design.pay.strategy; ...@@ -2,7 +2,15 @@ package com.study.design.pay.strategy;
import com.study.design.pay.pojo.PayBody; import com.study.design.pay.pojo.PayBody;
public class BkPayStrategy implements PayStrategy{
/**
* 银行卡支付
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:06
*/
public class BkPayStrategy implements PayStrategy {
@Override @Override
public Boolean pay(PayBody payBody) { public Boolean pay(PayBody payBody) {
// 支付细节省略 // 支付细节省略
......
...@@ -3,20 +3,30 @@ package com.study.design.pay.strategy; ...@@ -3,20 +3,30 @@ package com.study.design.pay.strategy;
import com.study.design.pay.pojo.PayBody; import com.study.design.pay.pojo.PayBody;
/** /**
* // 增加一个付款方式的话,需要写一个 strategy的子类实现类,类似Wc。 * 增加一个付款方式的话,需要写一个 strategy的子类实现类,类似Wc。
* // 枚举类增加一个枚举,就一行代码。 * 枚举类增加一个枚举,就一行代码。
* // 门面类 中枚举获取的修改。 * 门面类 中枚举获取的修改。
* // 扩展性良好,而且不影响 调用端。我们的任何改动,不需要让调用端知道。 * 扩展性良好,而且不影响 调用端。我们的任何改动,不需要让调用端知道。
* *
* @author : qinyingjie * @author : qinyingjie
* @version : 2.2.0 * @version : 2.2.0
* @date : 2022/9/27 02:22 * @date : 2022/9/27 02:22
*/ */
public interface PayStrategy { public interface PayStrategy {
/**
* 支付方式
*
* @param payBody
* @return
*/
Boolean pay(PayBody payBody); Boolean pay(PayBody payBody);
// 之所以使用interface,是因为我们的所有的策略接口下的方法都是需要复写的, // 之所以使用interface,是因为我们的所有的策略接口下的方法都是需要复写的,
// 没有公共的、可重用的方法。 // 没有公共的、可重用的方法。
//abstract class 他能够有自己的 抽象方法(需要子类复写的) //abstract class 他能够有自己的 抽象方法(需要子类复写的)
// abstract class 他也能够有自己的可执行方法(普通的方法,不抽象的) // abstract class 他也能够有自己的可执行方法(普通的方法,不抽象的)
} }
...@@ -2,7 +2,15 @@ package com.study.design.pay.strategy; ...@@ -2,7 +2,15 @@ package com.study.design.pay.strategy;
import com.study.design.pay.pojo.PayBody; import com.study.design.pay.pojo.PayBody;
public class WcPayStrategy implements PayStrategy{
/**
* 微信支付
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:05
*/
public class WcPayStrategy implements PayStrategy {
@Override @Override
public Boolean pay(PayBody payBody) { public Boolean pay(PayBody payBody) {
// 支付细节省略 // 支付细节省略
......
...@@ -2,7 +2,15 @@ package com.study.design.pay.strategy; ...@@ -2,7 +2,15 @@ package com.study.design.pay.strategy;
import com.study.design.pay.pojo.PayBody; import com.study.design.pay.pojo.PayBody;
public class ZfbPayStrategy implements PayStrategy{
/**
* 支付宝支付
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:06
*/
public class ZfbPayStrategy implements PayStrategy {
@Override @Override
public Boolean pay(PayBody payBody) { public Boolean pay(PayBody payBody) {
//支付细节省略 //支付细节省略
......
...@@ -2,6 +2,19 @@ package com.study.design.pay.strategyContext; ...@@ -2,6 +2,19 @@ package com.study.design.pay.strategyContext;
import com.study.design.pay.pojo.PayBody; import com.study.design.pay.pojo.PayBody;
/**
* 支付抽象类
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:07
*/
public abstract class AbstractPayContext { public abstract class AbstractPayContext {
/**
* 执行方法
*
* @param payBody
* @return
*/
public abstract Boolean execute(PayBody payBody); public abstract Boolean execute(PayBody payBody);
} }
...@@ -4,15 +4,17 @@ import com.study.design.pay.strategy.PayStrategy; ...@@ -4,15 +4,17 @@ import com.study.design.pay.strategy.PayStrategy;
import com.study.design.pay.pojo.PayBody; import com.study.design.pay.pojo.PayBody;
/** /**
* // 动态地给一个对象添加一些额外的职责. 就得在根儿上添加。 * PayStrategy的包装类
* //PayContext 就是我们的被装饰者,因为我们想给payContext添加额外功能:平台币更新和红包 * 动态地给一个对象添加一些额外的职责. 就得在根儿上添加。
* // 所以我们选择使用装饰者模式。被装饰者必须要有 接口或者抽象类。也就是类图中的 * PayContext 就是我们的被装饰者,因为我们想给payContext添加额外功能:平台币更新和红包
* 所以我们选择使用装饰者模式。被装饰者必须要有 接口或者抽象类。也就是类图中的
* *
* @author : qinyingjie * @author : qinyingjie
* @version : 2.2.0 * @version : 2.2.0
* @date : 2022/9/27 02:22 * @date : 2022/9/27 02:22
*/ */
public class PayContext extends AbstractPayContext { public class PayContext extends AbstractPayContext {
private PayStrategy payStrategy; private PayStrategy payStrategy;
public PayContext(PayStrategy payStrategy) { public PayContext(PayStrategy payStrategy) {
......
package com.study.design.pay.strategyEnum; package com.study.design.pay.strategyEnum;
/**
* 策略枚举
*
* @author : qinyingjie
* @version : 2.2.0
* @date : 2023/7/29 09:08
*/
public enum StrategyEnum { public enum StrategyEnum {
/**
* 支付宝
*/
ZfbPayStrategy("com.study.design.pay.strategy.ZfbPayStrategy"), ZfbPayStrategy("com.study.design.pay.strategy.ZfbPayStrategy"),
/**
* 微信
*/
WcPayStrategy("com.study.design.pay.strategy.WcPayStrategy"), WcPayStrategy("com.study.design.pay.strategy.WcPayStrategy"),
/**
* 银行
*/
BkPayStrategy("com.study.design.pay.strategy.BkPayStrategy"); BkPayStrategy("com.study.design.pay.strategy.BkPayStrategy");
String value = ""; String value = "";
StrategyEnum(String value) { StrategyEnum(String value) {
this.value = value; this.value = value;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册