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