Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Kwan的解忧杂货铺@新空间代码工作室
design
提交
6106c597
D
design
项目概览
Kwan的解忧杂货铺@新空间代码工作室
/
design
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
design
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
6106c597
编写于
7月 29, 2023
作者:
Kwan的解忧杂货铺@新空间代码工作室
🐭
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:支付模块
上级
7d4f04f2
变更
13
显示空白变更内容
内联
并排
Showing
13 changed file
with
135 addition
and
18 deletion
+135
-18
README.md
README.md
+2
-1
src/main/java/com/study/design/pay/facade/StrategyFacade.java
...main/java/com/study/design/pay/facade/StrategyFacade.java
+10
-3
src/main/java/com/study/design/pay/factory/AddFuncFactory.java
...ain/java/com/study/design/pay/factory/AddFuncFactory.java
+9
-1
src/main/java/com/study/design/pay/factory/StrategyFactory.java
...in/java/com/study/design/pay/factory/StrategyFactory.java
+10
-3
src/main/java/com/study/design/pay/pojo/PayBody.java
src/main/java/com/study/design/pay/pojo/PayBody.java
+19
-0
src/main/java/com/study/design/pay/proxy/ContextProxy.java
src/main/java/com/study/design/pay/proxy/ContextProxy.java
+7
-0
src/main/java/com/study/design/pay/strategy/BkPayStrategy.java
...ain/java/com/study/design/pay/strategy/BkPayStrategy.java
+9
-1
src/main/java/com/study/design/pay/strategy/PayStrategy.java
src/main/java/com/study/design/pay/strategy/PayStrategy.java
+14
-4
src/main/java/com/study/design/pay/strategy/WcPayStrategy.java
...ain/java/com/study/design/pay/strategy/WcPayStrategy.java
+9
-1
src/main/java/com/study/design/pay/strategy/ZfbPayStrategy.java
...in/java/com/study/design/pay/strategy/ZfbPayStrategy.java
+9
-1
src/main/java/com/study/design/pay/strategyContext/AbstractPayContext.java
.../study/design/pay/strategyContext/AbstractPayContext.java
+13
-0
src/main/java/com/study/design/pay/strategyContext/PayContext.java
...java/com/study/design/pay/strategyContext/PayContext.java
+5
-3
src/main/java/com/study/design/pay/strategyEnum/StrategyEnum.java
.../java/com/study/design/pay/strategyEnum/StrategyEnum.java
+19
-0
未找到文件。
README.md
浏览文件 @
6106c597
# 设计模式学习
# 设计模式学习
# 后期转移到 模块里面去 不转也可以
### 策略模式+工厂模式+门面模式 实现动态支付
\ 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
src/main/java/com/study/design/pay/facade/StrategyFacade.java
浏览文件 @
6106c597
...
@@ -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
;
}
}
//获取我们的策略对象
//获取我们的策略对象
...
...
src/main/java/com/study/design/pay/factory/AddFuncFactory.java
浏览文件 @
6106c597
...
@@ -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
);
}
}
...
...
src/main/java/com/study/design/pay/factory/StrategyFactory.java
浏览文件 @
6106c597
...
@@ -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类,他是以产出(一类行为类:策略)为导向的
}
}
src/main/java/com/study/design/pay/pojo/PayBody.java
浏览文件 @
6106c597
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
()
{
...
...
src/main/java/com/study/design/pay/proxy/ContextProxy.java
浏览文件 @
6106c597
...
@@ -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
;
...
...
src/main/java/com/study/design/pay/strategy/BkPayStrategy.java
浏览文件 @
6106c597
...
@@ -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
)
{
// 支付细节省略
// 支付细节省略
...
...
src/main/java/com/study/design/pay/strategy/PayStrategy.java
浏览文件 @
6106c597
...
@@ -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 他也能够有自己的可执行方法(普通的方法,不抽象的)
}
}
src/main/java/com/study/design/pay/strategy/WcPayStrategy.java
浏览文件 @
6106c597
...
@@ -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
)
{
// 支付细节省略
// 支付细节省略
...
...
src/main/java/com/study/design/pay/strategy/ZfbPayStrategy.java
浏览文件 @
6106c597
...
@@ -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
)
{
//支付细节省略
//支付细节省略
...
...
src/main/java/com/study/design/pay/strategyContext/AbstractPayContext.java
浏览文件 @
6106c597
...
@@ -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
);
}
}
src/main/java/com/study/design/pay/strategyContext/PayContext.java
浏览文件 @
6106c597
...
@@ -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
)
{
...
...
src/main/java/com/study/design/pay/strategyEnum/StrategyEnum.java
浏览文件 @
6106c597
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录