From 6106c5973304f47d5716e011ecde12b7b87e3725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E8=8B=B1=E6=9D=B0?= <327782001@qq.com> Date: Sat, 29 Jul 2023 11:41:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=94=AF=E4=BB=98=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- .../design/pay/facade/StrategyFacade.java | 13 ++++++++++--- .../design/pay/factory/AddFuncFactory.java | 10 +++++++++- .../design/pay/factory/StrategyFactory.java | 13 ++++++++++--- .../com/study/design/pay/pojo/PayBody.java | 19 +++++++++++++++++++ .../study/design/pay/proxy/ContextProxy.java | 7 +++++++ .../design/pay/strategy/BkPayStrategy.java | 10 +++++++++- .../design/pay/strategy/PayStrategy.java | 18 ++++++++++++++---- .../design/pay/strategy/WcPayStrategy.java | 10 +++++++++- .../design/pay/strategy/ZfbPayStrategy.java | 10 +++++++++- .../strategyContext/AbstractPayContext.java | 13 +++++++++++++ .../pay/strategyContext/PayContext.java | 8 +++++--- .../design/pay/strategyEnum/StrategyEnum.java | 19 +++++++++++++++++++ 13 files changed, 135 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 1aae528..fbd78da 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ # 设计模式学习 -# 后期转移到 模块里面去 不转也可以 \ 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 diff --git a/src/main/java/com/study/design/pay/facade/StrategyFacade.java b/src/main/java/com/study/design/pay/facade/StrategyFacade.java index f067cbc..bac4c58 100644 --- a/src/main/java/com/study/design/pay/facade/StrategyFacade.java +++ b/src/main/java/com/study/design/pay/facade/StrategyFacade.java @@ -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; } //获取我们的策略对象 diff --git a/src/main/java/com/study/design/pay/factory/AddFuncFactory.java b/src/main/java/com/study/design/pay/factory/AddFuncFactory.java index 93ec4a1..2d04767 100644 --- a/src/main/java/com/study/design/pay/factory/AddFuncFactory.java +++ b/src/main/java/com/study/design/pay/factory/AddFuncFactory.java @@ -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 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); } diff --git a/src/main/java/com/study/design/pay/factory/StrategyFactory.java b/src/main/java/com/study/design/pay/factory/StrategyFactory.java index aed2f0b..13c7c01 100644 --- a/src/main/java/com/study/design/pay/factory/StrategyFactory.java +++ b/src/main/java/com/study/design/pay/factory/StrategyFactory.java @@ -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 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类,他是以产出(一类行为类:策略)为导向的 } diff --git a/src/main/java/com/study/design/pay/pojo/PayBody.java b/src/main/java/com/study/design/pay/pojo/PayBody.java index 27b777d..4d5b816 100644 --- a/src/main/java/com/study/design/pay/pojo/PayBody.java +++ b/src/main/java/com/study/design/pay/pojo/PayBody.java @@ -1,9 +1,28 @@ 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() { diff --git a/src/main/java/com/study/design/pay/proxy/ContextProxy.java b/src/main/java/com/study/design/pay/proxy/ContextProxy.java index 515ba01..b44863e 100644 --- a/src/main/java/com/study/design/pay/proxy/ContextProxy.java +++ b/src/main/java/com/study/design/pay/proxy/ContextProxy.java @@ -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; diff --git a/src/main/java/com/study/design/pay/strategy/BkPayStrategy.java b/src/main/java/com/study/design/pay/strategy/BkPayStrategy.java index b7912a8..cee5f84 100644 --- a/src/main/java/com/study/design/pay/strategy/BkPayStrategy.java +++ b/src/main/java/com/study/design/pay/strategy/BkPayStrategy.java @@ -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) { // 支付细节省略 diff --git a/src/main/java/com/study/design/pay/strategy/PayStrategy.java b/src/main/java/com/study/design/pay/strategy/PayStrategy.java index 75484f2..3901487 100644 --- a/src/main/java/com/study/design/pay/strategy/PayStrategy.java +++ b/src/main/java/com/study/design/pay/strategy/PayStrategy.java @@ -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 他也能够有自己的可执行方法(普通的方法,不抽象的) + } diff --git a/src/main/java/com/study/design/pay/strategy/WcPayStrategy.java b/src/main/java/com/study/design/pay/strategy/WcPayStrategy.java index 02374b1..82817bd 100644 --- a/src/main/java/com/study/design/pay/strategy/WcPayStrategy.java +++ b/src/main/java/com/study/design/pay/strategy/WcPayStrategy.java @@ -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) { // 支付细节省略 diff --git a/src/main/java/com/study/design/pay/strategy/ZfbPayStrategy.java b/src/main/java/com/study/design/pay/strategy/ZfbPayStrategy.java index 1d0d571..23c394b 100644 --- a/src/main/java/com/study/design/pay/strategy/ZfbPayStrategy.java +++ b/src/main/java/com/study/design/pay/strategy/ZfbPayStrategy.java @@ -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) { //支付细节省略 diff --git a/src/main/java/com/study/design/pay/strategyContext/AbstractPayContext.java b/src/main/java/com/study/design/pay/strategyContext/AbstractPayContext.java index 8fa3c7f..a7d38ea 100644 --- a/src/main/java/com/study/design/pay/strategyContext/AbstractPayContext.java +++ b/src/main/java/com/study/design/pay/strategyContext/AbstractPayContext.java @@ -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); } diff --git a/src/main/java/com/study/design/pay/strategyContext/PayContext.java b/src/main/java/com/study/design/pay/strategyContext/PayContext.java index 8ec8dff..56b71f1 100644 --- a/src/main/java/com/study/design/pay/strategyContext/PayContext.java +++ b/src/main/java/com/study/design/pay/strategyContext/PayContext.java @@ -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) { diff --git a/src/main/java/com/study/design/pay/strategyEnum/StrategyEnum.java b/src/main/java/com/study/design/pay/strategyEnum/StrategyEnum.java index fe9c2b2..25ce19f 100644 --- a/src/main/java/com/study/design/pay/strategyEnum/StrategyEnum.java +++ b/src/main/java/com/study/design/pay/strategyEnum/StrategyEnum.java @@ -1,10 +1,29 @@ 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; } -- GitLab