Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Kwan的解忧杂货铺@新空间代码工作室
design
提交
903b2f1c
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看板
提交
903b2f1c
编写于
7月 29, 2023
作者:
Kwan的解忧杂货铺@新空间代码工作室
🐭
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix:代码添加注释 与 优化
上级
257e9695
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
29 addition
and
13 deletion
+29
-13
src/main/java/com/study/design/pay/facade/StrategyFacade.java
...main/java/com/study/design/pay/facade/StrategyFacade.java
+25
-12
src/main/java/com/study/design/pay/factory/StrategyFactory.java
...in/java/com/study/design/pay/factory/StrategyFactory.java
+4
-1
未找到文件。
src/main/java/com/study/design/pay/facade/StrategyFacade.java
浏览文件 @
903b2f1c
...
...
@@ -18,17 +18,24 @@ import com.study.design.pay.factory.StrategyFactory;
* @date : 2023/7/29 09:22
*/
public
class
StrategyFacade
{
// 定义一个map,将对应关系提前初始化好。
// 双十一的时候,有大量的用户进行下单(千万级),就会造成千万级的pay接口的调用。
// 很可惜,这部分代码里边有两个 new 关键字(new PayContext(payStrategy) 和 new AddFuncDecorator)。
// 如果瞬时见。有几十万的并发进来,那么会创建几十万个 context对象和 addFunc对象,造成 年轻代的eden区的频繁对象创建
// 虽然说调用完就进行了对象的垃圾收集,但是这么多的访问对象进来会造成,minorgc。
// 1. 单例模式吗?PayContext创建是基于payStrategy,不止一种paycontext啊,用单例不行呀。 AddFuncDecorator 是基于PayContext
// 创建的,PayContext 不止一种,AddFuncDecorator 也不止一种。
// 2. 享元模式。享元模式是单例模式的一种思想升级。单例模式,针对的是同一种对象,没有任何不同的细节。而享元模式,针对多个对象。
// 多个对象:同一种class,但是里边的属性有些许不同。PayContext是同一种对象吧?是的; PayContext 是不是有细节上的不同呢?是的,
// payStrategy不同; 那么我们是否可以知道这个PayContext的种类数量呢?是的,目前有三种。 享元模式能够对这可控数量的有不同细节的
//同一种class对象进行共享,保证我们的程序不频繁的创建对象。
/**
* 定义一个map,将对应关系提前初始化好。
* 双十一的时候,有大量的用户进行下单(千万级),就会造成千万级的pay接口的调用。
* 很可惜,这部分代码里边有两个 new 关键字(new PayContext(payStrategy) 和 new AddFuncDecorator)。
* 如果瞬时见。有几十万的并发进来,那么会创建几十万个 context对象和 addFunc对象,造成 年轻代的eden区的频繁对象创建
* 虽然说调用完就进行了对象的垃圾收集,但是这么多的访问对象进来会造成,minorgc。
* 1. 单例模式吗?PayContext创建是基于payStrategy,不止一种paycontext啊,用单例不行呀。 AddFuncDecorator 是基于PayContext
* 创建的,PayContext 不止一种,AddFuncDecorator 也不止一种。
* 2. 享元模式。享元模式是单例模式的一种思想升级。单例模式,针对的是同一种对象,没有任何不同的细节。而享元模式,针对多个对象。
* 多个对象:同一种class,但是里边的属性有些许不同。PayContext是同一种对象吧?是的; PayContext 是不是有细节上的不同呢?是的,
* payStrategy不同; 那么我们是否可以知道这个PayContext的种类数量呢?是的,目前有三种。 享元模式能够对这可控数量的有不同细节的
* 同一种class对象进行共享,保证我们的程序不频繁的创建对象。
*
* @param payBody
* @return
*/
public
static
Boolean
pay
(
PayBody
payBody
)
{
//获取我们的 策略枚举
StrategyEnum
strategyEnum
=
getStrategyEnum
(
payBody
.
getType
());
...
...
@@ -38,7 +45,7 @@ public class StrategyFacade {
//获取我们的策略对象
PayStrategy
payStrategy
=
StrategyFactory
.
getPayStrategy
(
strategyEnum
);
//生成我们的策略上下文
PayContext
context
=
new
PayContext
(
payStrategy
);
// TO DO
PayContext
context
=
new
PayContext
(
payStrategy
);
// 装饰一下 context,。立马多了一个功能
// 我看这行代码啊,就不顺眼。代理模式搞他。
AddFuncDecorator
addFuncDecorator
=
(
AddFuncDecorator
)
AddFuncFactory
.
getAddFunc
(
context
);
...
...
@@ -46,6 +53,12 @@ public class StrategyFacade {
return
addFuncDecorator
.
execute
(
payBody
);
}
/**
* 根据type获取测罗枚举
*
* @param type
* @return
*/
private
static
StrategyEnum
getStrategyEnum
(
int
type
)
{
switch
(
type
)
{
case
0
:
...
...
src/main/java/com/study/design/pay/factory/StrategyFactory.java
浏览文件 @
903b2f1c
...
...
@@ -16,7 +16,10 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public
class
StrategyFactory
{
//思想升级之后的享元,模式了。
/**
* 单例模式
* 思想升级之后的享元,模式了
*/
private
static
final
Map
<
String
,
PayStrategy
>
strategyMaps
=
new
ConcurrentHashMap
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录