Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
震旦纪
itstack-demo-design
提交
13faa897
I
itstack-demo-design
项目概览
震旦纪
/
itstack-demo-design
与 Fork 源项目一致
Fork自
fuzhengwei / itstack-demo-design
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
itstack-demo-design
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
13faa897
编写于
6月 08, 2020
作者:
小傅哥
⛹
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
小傅哥 | 重学 Java 设计模式:实战组合模式
上级
e573c6dc
变更
20
隐藏空白更改
内联
并排
Showing
20 changed file
with
771 addition
and
1 deletion
+771
-1
.gitignore
.gitignore
+2
-0
itstack-demo-design-8-01/pom.xml
itstack-demo-design-8-01/pom.xml
+15
-0
itstack-demo-design-8-01/src/main/java/org/itstack/demo/design/EngineController.java
...c/main/java/org/itstack/demo/design/EngineController.java
+39
-0
itstack-demo-design-8-01/src/test/java/org/itstack/demo/design/test/ApiTest.java
...1/src/test/java/org/itstack/demo/design/test/ApiTest.java
+19
-0
itstack-demo-design-8-02/pom.xml
itstack-demo-design-8-02/pom.xml
+27
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/aggregates/TreeRich.java
...itstack/demo/design/domain/model/aggregates/TreeRich.java
+39
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/vo/EngineResult.java
...org/itstack/demo/design/domain/model/vo/EngineResult.java
+71
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/vo/TreeNode.java
...ava/org/itstack/demo/design/domain/model/vo/TreeNode.java
+77
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/vo/TreeNodeLink.java
...org/itstack/demo/design/domain/model/vo/TreeNodeLink.java
+47
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/vo/TreeRoot.java
...ava/org/itstack/demo/design/domain/model/vo/TreeRoot.java
+38
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/engine/EngineBase.java
...itstack/demo/design/domain/service/engine/EngineBase.java
+44
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/engine/EngineConfig.java
...stack/demo/design/domain/service/engine/EngineConfig.java
+34
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/engine/IEngine.java
...rg/itstack/demo/design/domain/service/engine/IEngine.java
+12
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/engine/impl/TreeEngineHandle.java
...o/design/domain/service/engine/impl/TreeEngineHandle.java
+20
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/logic/BaseLogic.java
...g/itstack/demo/design/domain/service/logic/BaseLogic.java
+45
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/logic/LogicFilter.java
...itstack/demo/design/domain/service/logic/LogicFilter.java
+33
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/logic/impl/UserAgeFilter.java
.../demo/design/domain/service/logic/impl/UserAgeFilter.java
+14
-0
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/logic/impl/UserGenderFilter.java
...mo/design/domain/service/logic/impl/UserGenderFilter.java
+14
-0
itstack-demo-design-8-02/src/test/java/org/itstack/demo/design/test/ApiTest.java
...2/src/test/java/org/itstack/demo/design/test/ApiTest.java
+178
-0
pom.xml
pom.xml
+3
-1
未找到文件。
.gitignore
浏览文件 @
13faa897
...
@@ -16,3 +16,5 @@
...
@@ -16,3 +16,5 @@
/itstack-demo-design-6-00/itstack-demo-design-6-00.iml
/itstack-demo-design-6-00/itstack-demo-design-6-00.iml
/itstack-demo-design-7-01/itstack-demo-design-7-01.iml
/itstack-demo-design-7-01/itstack-demo-design-7-01.iml
/itstack-demo-design-7-02/itstack-demo-design-7-02.iml
/itstack-demo-design-7-02/itstack-demo-design-7-02.iml
/itstack-demo-design-8-01/itstack-demo-design-8-01.iml
/itstack-demo-design-8-02/itstack-demo-design-8-02.iml
itstack-demo-design-8-01/pom.xml
0 → 100644
浏览文件 @
13faa897
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<parent>
<artifactId>
itstack-demo-design
</artifactId>
<groupId>
org.itstack
</groupId>
<version>
1.0-SNAPSHOT
</version>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
itstack-demo-design-8-01
</artifactId>
</project>
\ No newline at end of file
itstack-demo-design-8-01/src/main/java/org/itstack/demo/design/EngineController.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
public
class
EngineController
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
EngineController
.
class
);
public
String
process
(
final
String
userId
,
final
String
userSex
,
final
int
userAge
)
{
logger
.
info
(
"ifelse实现方式判断用户结果。userId:{} userSex:{} userAge:{}"
,
userId
,
userSex
,
userAge
);
if
(
"man"
.
equals
(
userSex
))
{
if
(
userAge
<
25
)
{
return
"果实A"
;
}
if
(
userAge
>=
25
)
{
return
"果实B"
;
}
}
if
(
"woman"
.
equals
(
userSex
))
{
if
(
userAge
<
25
)
{
return
"果实C"
;
}
if
(
userAge
>=
25
)
{
return
"果实D"
;
}
}
return
null
;
}
}
itstack-demo-design-8-01/src/test/java/org/itstack/demo/design/test/ApiTest.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.test
;
import
org.itstack.demo.design.EngineController
;
import
org.junit.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
public
class
ApiTest
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
ApiTest
.
class
);
@Test
public
void
test_EngineController
()
{
EngineController
engineController
=
new
EngineController
();
String
process
=
engineController
.
process
(
"Oli09pLkdjh"
,
"man"
,
29
);
logger
.
info
(
"测试结果:{}"
,
process
);
}
}
itstack-demo-design-8-02/pom.xml
0 → 100644
浏览文件 @
13faa897
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<parent>
<artifactId>
itstack-demo-design
</artifactId>
<groupId>
org.itstack
</groupId>
<version>
1.0-SNAPSHOT
</version>
</parent>
<modelVersion>
4.0.0
</modelVersion>
<artifactId>
itstack-demo-design-8-02
</artifactId>
<build>
<plugins>
<plugin>
<groupId>
org.apache.maven.plugins
</groupId>
<artifactId>
maven-compiler-plugin
</artifactId>
<configuration>
<source>
6
</source>
<target>
6
</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/aggregates/TreeRich.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.model.aggregates
;
import
org.itstack.demo.design.domain.model.vo.TreeNode
;
import
org.itstack.demo.design.domain.model.vo.TreeRoot
;
import
java.util.Map
;
/**
* 规则树聚合
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
public
class
TreeRich
{
private
TreeRoot
treeRoot
;
//树根信息
private
Map
<
Long
,
TreeNode
>
treeNodeMap
;
//树节点ID -> 子节点
public
TreeRich
(
TreeRoot
treeRoot
,
Map
<
Long
,
TreeNode
>
treeNodeMap
)
{
this
.
treeRoot
=
treeRoot
;
this
.
treeNodeMap
=
treeNodeMap
;
}
public
TreeRoot
getTreeRoot
()
{
return
treeRoot
;
}
public
void
setTreeRoot
(
TreeRoot
treeRoot
)
{
this
.
treeRoot
=
treeRoot
;
}
public
Map
<
Long
,
TreeNode
>
getTreeNodeMap
()
{
return
treeNodeMap
;
}
public
void
setTreeNodeMap
(
Map
<
Long
,
TreeNode
>
treeNodeMap
)
{
this
.
treeNodeMap
=
treeNodeMap
;
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/vo/EngineResult.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.model.vo
;
/**
* 决策结果
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
public
class
EngineResult
{
private
boolean
isSuccess
;
//执行结果
private
String
userId
;
//用户ID
private
Long
treeId
;
//规则树ID
private
Long
nodeId
;
//果实节点ID
private
String
nodeValue
;
//果实节点值
public
EngineResult
()
{
}
public
EngineResult
(
boolean
isSuccess
)
{
this
.
isSuccess
=
isSuccess
;
}
public
EngineResult
(
String
userId
,
Long
treeId
,
Long
nodeId
,
String
nodeValue
)
{
this
.
isSuccess
=
true
;
this
.
userId
=
userId
;
this
.
treeId
=
treeId
;
this
.
nodeId
=
nodeId
;
this
.
nodeValue
=
nodeValue
;
}
public
boolean
isSuccess
()
{
return
isSuccess
;
}
public
void
setSuccess
(
boolean
success
)
{
isSuccess
=
success
;
}
public
String
getUserId
()
{
return
userId
;
}
public
void
setUserId
(
String
userId
)
{
this
.
userId
=
userId
;
}
public
Long
getTreeId
()
{
return
treeId
;
}
public
void
setTreeId
(
Long
treeId
)
{
this
.
treeId
=
treeId
;
}
public
Long
getNodeId
()
{
return
nodeId
;
}
public
void
setNodeId
(
Long
nodeId
)
{
this
.
nodeId
=
nodeId
;
}
public
String
getNodeValue
()
{
return
nodeValue
;
}
public
void
setNodeValue
(
String
nodeValue
)
{
this
.
nodeValue
=
nodeValue
;
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/vo/TreeNode.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.model.vo
;
import
java.util.List
;
/**
* 规则树节点信息
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 小傅哥 on @2020
*/
public
class
TreeNode
{
private
Long
treeId
;
//规则树ID
private
Long
treeNodeId
;
//规则树节点ID
private
Integer
nodeType
;
//节点类型;1子叶、2果实
private
String
nodeValue
;
//节点值[nodeType=2];果实值
private
String
ruleKey
;
//规则Key
private
String
ruleDesc
;
//规则描述
private
List
<
TreeNodeLink
>
treeNodeLinkList
;
//节点链路
public
Long
getTreeId
()
{
return
treeId
;
}
public
void
setTreeId
(
Long
treeId
)
{
this
.
treeId
=
treeId
;
}
public
Long
getTreeNodeId
()
{
return
treeNodeId
;
}
public
void
setTreeNodeId
(
Long
treeNodeId
)
{
this
.
treeNodeId
=
treeNodeId
;
}
public
Integer
getNodeType
()
{
return
nodeType
;
}
public
void
setNodeType
(
Integer
nodeType
)
{
this
.
nodeType
=
nodeType
;
}
public
String
getNodeValue
()
{
return
nodeValue
;
}
public
void
setNodeValue
(
String
nodeValue
)
{
this
.
nodeValue
=
nodeValue
;
}
public
String
getRuleKey
()
{
return
ruleKey
;
}
public
void
setRuleKey
(
String
ruleKey
)
{
this
.
ruleKey
=
ruleKey
;
}
public
String
getRuleDesc
()
{
return
ruleDesc
;
}
public
void
setRuleDesc
(
String
ruleDesc
)
{
this
.
ruleDesc
=
ruleDesc
;
}
public
List
<
TreeNodeLink
>
getTreeNodeLinkList
()
{
return
treeNodeLinkList
;
}
public
void
setTreeNodeLinkList
(
List
<
TreeNodeLink
>
treeNodeLinkList
)
{
this
.
treeNodeLinkList
=
treeNodeLinkList
;
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/vo/TreeNodeLink.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.model.vo
;
/**
* 规则树线信息
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 小傅哥 on @2020
*/
public
class
TreeNodeLink
{
private
Long
nodeIdFrom
;
//节点From
private
Long
nodeIdTo
;
//节点To
private
Integer
ruleLimitType
;
//限定类型;1:=;2:>;3:<;4:>=;5<=;6:enum[枚举范围]
private
String
ruleLimitValue
;
//限定值
public
Long
getNodeIdFrom
()
{
return
nodeIdFrom
;
}
public
void
setNodeIdFrom
(
Long
nodeIdFrom
)
{
this
.
nodeIdFrom
=
nodeIdFrom
;
}
public
Long
getNodeIdTo
()
{
return
nodeIdTo
;
}
public
void
setNodeIdTo
(
Long
nodeIdTo
)
{
this
.
nodeIdTo
=
nodeIdTo
;
}
public
Integer
getRuleLimitType
()
{
return
ruleLimitType
;
}
public
void
setRuleLimitType
(
Integer
ruleLimitType
)
{
this
.
ruleLimitType
=
ruleLimitType
;
}
public
String
getRuleLimitValue
()
{
return
ruleLimitValue
;
}
public
void
setRuleLimitValue
(
String
ruleLimitValue
)
{
this
.
ruleLimitValue
=
ruleLimitValue
;
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/model/vo/TreeRoot.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.model.vo
;
/**
* 树根信息
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 小傅哥 on @2020
*/
public
class
TreeRoot
{
private
Long
treeId
;
//规则树ID
private
Long
treeRootNodeId
;
//规则树根ID
private
String
treeName
;
//规则树名称
public
Long
getTreeId
()
{
return
treeId
;
}
public
void
setTreeId
(
Long
treeId
)
{
this
.
treeId
=
treeId
;
}
public
Long
getTreeRootNodeId
()
{
return
treeRootNodeId
;
}
public
void
setTreeRootNodeId
(
Long
treeRootNodeId
)
{
this
.
treeRootNodeId
=
treeRootNodeId
;
}
public
String
getTreeName
()
{
return
treeName
;
}
public
void
setTreeName
(
String
treeName
)
{
this
.
treeName
=
treeName
;
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/engine/EngineBase.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.service.engine
;
import
org.itstack.demo.design.domain.model.aggregates.TreeRich
;
import
org.itstack.demo.design.domain.model.vo.EngineResult
;
import
org.itstack.demo.design.domain.model.vo.TreeNode
;
import
org.itstack.demo.design.domain.model.vo.TreeRoot
;
import
org.itstack.demo.design.domain.service.logic.LogicFilter
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.Map
;
/**
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 小傅哥 on @2020
*/
public
abstract
class
EngineBase
extends
EngineConfig
implements
IEngine
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
EngineBase
.
class
);
@Override
public
abstract
EngineResult
process
(
Long
treeId
,
String
userId
,
TreeRich
treeRich
,
Map
<
String
,
String
>
decisionMatter
);
protected
TreeNode
engineDecisionMaker
(
TreeRich
treeRich
,
Long
treeId
,
String
userId
,
Map
<
String
,
String
>
decisionMatter
)
{
TreeRoot
treeRoot
=
treeRich
.
getTreeRoot
();
Map
<
Long
,
TreeNode
>
treeNodeMap
=
treeRich
.
getTreeNodeMap
();
// 规则树根ID
Long
rootNodeId
=
treeRoot
.
getTreeRootNodeId
();
TreeNode
treeNodeInfo
=
treeNodeMap
.
get
(
rootNodeId
);
//节点类型[NodeType];1子叶、2果实
while
(
treeNodeInfo
.
getNodeType
().
equals
(
1
))
{
String
ruleKey
=
treeNodeInfo
.
getRuleKey
();
LogicFilter
logicFilter
=
logicFilterMap
.
get
(
ruleKey
);
String
matterValue
=
logicFilter
.
matterValue
(
treeId
,
userId
,
decisionMatter
);
Long
nextNode
=
logicFilter
.
filter
(
matterValue
,
treeNodeInfo
.
getTreeNodeLinkList
());
treeNodeInfo
=
treeNodeMap
.
get
(
nextNode
);
logger
.
info
(
"决策树引擎=>{} userId:{} treeId:{} treeNode:{} ruleKey:{} matterValue:{}"
,
treeRoot
.
getTreeName
(),
userId
,
treeId
,
treeNodeInfo
.
getTreeNodeId
(),
ruleKey
,
matterValue
);
}
return
treeNodeInfo
;
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/engine/EngineConfig.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.service.engine
;
import
org.itstack.demo.design.domain.service.logic.LogicFilter
;
import
org.itstack.demo.design.domain.service.logic.impl.UserAgeFilter
;
import
org.itstack.demo.design.domain.service.logic.impl.UserGenderFilter
;
import
java.util.Map
;
import
java.util.concurrent.ConcurrentHashMap
;
/**
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 小傅哥 on @2020
*/
public
class
EngineConfig
{
static
Map
<
String
,
LogicFilter
>
logicFilterMap
;
static
{
logicFilterMap
=
new
ConcurrentHashMap
<>();
logicFilterMap
.
put
(
"userAge"
,
new
UserAgeFilter
());
logicFilterMap
.
put
(
"userGender"
,
new
UserGenderFilter
());
}
public
Map
<
String
,
LogicFilter
>
getLogicFilterMap
()
{
return
logicFilterMap
;
}
public
void
setLogicFilterMap
(
Map
<
String
,
LogicFilter
>
logicFilterMap
)
{
this
.
logicFilterMap
=
logicFilterMap
;
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/engine/IEngine.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.service.engine
;
import
org.itstack.demo.design.domain.model.aggregates.TreeRich
;
import
org.itstack.demo.design.domain.model.vo.EngineResult
;
import
java.util.Map
;
public
interface
IEngine
{
EngineResult
process
(
final
Long
treeId
,
final
String
userId
,
TreeRich
treeRich
,
final
Map
<
String
,
String
>
decisionMatter
);
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/engine/impl/TreeEngineHandle.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.service.engine.impl
;
import
org.itstack.demo.design.domain.model.aggregates.TreeRich
;
import
org.itstack.demo.design.domain.model.vo.EngineResult
;
import
org.itstack.demo.design.domain.model.vo.TreeNode
;
import
org.itstack.demo.design.domain.service.engine.EngineBase
;
import
java.util.Map
;
public
class
TreeEngineHandle
extends
EngineBase
{
@Override
public
EngineResult
process
(
Long
treeId
,
String
userId
,
TreeRich
treeRich
,
Map
<
String
,
String
>
decisionMatter
)
{
// 决策流程
TreeNode
treeNode
=
engineDecisionMaker
(
treeRich
,
treeId
,
userId
,
decisionMatter
);
// 决策结果
return
new
EngineResult
(
userId
,
treeId
,
treeNode
.
getTreeNodeId
(),
treeNode
.
getNodeValue
());
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/logic/BaseLogic.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.service.logic
;
import
org.itstack.demo.design.domain.model.vo.TreeNode
;
import
org.itstack.demo.design.domain.model.vo.TreeNodeLink
;
import
java.util.List
;
import
java.util.Map
;
/**
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 小傅哥 on @2020
*/
public
abstract
class
BaseLogic
implements
LogicFilter
{
@Override
public
Long
filter
(
String
matterValue
,
List
<
TreeNodeLink
>
treeNodeLinkList
)
{
for
(
TreeNodeLink
nodeLine
:
treeNodeLinkList
)
{
if
(
decisionLogic
(
matterValue
,
nodeLine
))
return
nodeLine
.
getNodeIdTo
();
}
return
0L
;
}
@Override
public
abstract
String
matterValue
(
Long
treeId
,
String
userId
,
Map
<
String
,
String
>
decisionMatter
);
private
boolean
decisionLogic
(
String
matterValue
,
TreeNodeLink
nodeLink
)
{
switch
(
nodeLink
.
getRuleLimitType
())
{
case
1
:
return
matterValue
.
equals
(
nodeLink
.
getRuleLimitValue
());
case
2
:
return
Double
.
parseDouble
(
matterValue
)
>
Double
.
parseDouble
(
nodeLink
.
getRuleLimitValue
());
case
3
:
return
Double
.
parseDouble
(
matterValue
)
<
Double
.
parseDouble
(
nodeLink
.
getRuleLimitValue
());
case
4
:
return
Double
.
parseDouble
(
matterValue
)
<=
Double
.
parseDouble
(
nodeLink
.
getRuleLimitValue
());
case
5
:
return
Double
.
parseDouble
(
matterValue
)
>=
Double
.
parseDouble
(
nodeLink
.
getRuleLimitValue
());
default
:
return
false
;
}
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/logic/LogicFilter.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.service.logic
;
import
org.itstack.demo.design.domain.model.vo.TreeNodeLink
;
import
java.util.List
;
import
java.util.Map
;
/**
* 微信公众号:bugstack虫洞栈 | 专注原创技术专题案例
* 论坛:http://bugstack.cn
* Create by 小傅哥 on @2020
*/
public
interface
LogicFilter
{
/**
* 逻辑决策器
*
* @param matterValue 决策值
* @param treeNodeLineInfoList 决策节点
* @return 下一个节点Id
*/
Long
filter
(
String
matterValue
,
List
<
TreeNodeLink
>
treeNodeLineInfoList
);
/**
* 获取决策值
*
* @param decisionMatter 决策物料
* @return 决策值
*/
String
matterValue
(
Long
treeId
,
String
userId
,
Map
<
String
,
String
>
decisionMatter
);
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/logic/impl/UserAgeFilter.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.service.logic.impl
;
import
org.itstack.demo.design.domain.service.logic.BaseLogic
;
import
java.util.Map
;
public
class
UserAgeFilter
extends
BaseLogic
{
@Override
public
String
matterValue
(
Long
treeId
,
String
userId
,
Map
<
String
,
String
>
decisionMatter
)
{
return
decisionMatter
.
get
(
"age"
);
}
}
itstack-demo-design-8-02/src/main/java/org/itstack/demo/design/domain/service/logic/impl/UserGenderFilter.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.domain.service.logic.impl
;
import
org.itstack.demo.design.domain.service.logic.BaseLogic
;
import
java.util.Map
;
public
class
UserGenderFilter
extends
BaseLogic
{
@Override
public
String
matterValue
(
Long
treeId
,
String
userId
,
Map
<
String
,
String
>
decisionMatter
)
{
return
decisionMatter
.
get
(
"gender"
);
}
}
itstack-demo-design-8-02/src/test/java/org/itstack/demo/design/test/ApiTest.java
0 → 100644
浏览文件 @
13faa897
package
org.itstack.demo.design.test
;
import
com.alibaba.fastjson.JSON
;
import
org.itstack.demo.design.domain.model.aggregates.TreeRich
;
import
org.itstack.demo.design.domain.model.vo.EngineResult
;
import
org.itstack.demo.design.domain.model.vo.TreeNode
;
import
org.itstack.demo.design.domain.model.vo.TreeNodeLink
;
import
org.itstack.demo.design.domain.model.vo.TreeRoot
;
import
org.itstack.demo.design.domain.service.engine.IEngine
;
import
org.itstack.demo.design.domain.service.engine.impl.TreeEngineHandle
;
import
org.junit.Before
;
import
org.junit.Test
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
public
class
ApiTest
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
ApiTest
.
class
);
private
TreeRich
treeRich
;
@Before
public
void
init
()
{
// 节点:1
TreeNode
treeNode_01
=
new
TreeNode
();
treeNode_01
.
setTreeId
(
10001L
);
treeNode_01
.
setTreeNodeId
(
1L
);
treeNode_01
.
setNodeType
(
1
);
treeNode_01
.
setNodeValue
(
null
);
treeNode_01
.
setRuleKey
(
"userGender"
);
treeNode_01
.
setRuleDesc
(
"用户性别[男/女]"
);
// 链接:1->11
TreeNodeLink
treeNodeLink_11
=
new
TreeNodeLink
();
treeNodeLink_11
.
setNodeIdFrom
(
1L
);
treeNodeLink_11
.
setNodeIdTo
(
11L
);
treeNodeLink_11
.
setRuleLimitType
(
1
);
treeNodeLink_11
.
setRuleLimitValue
(
"man"
);
// 链接:1->12
TreeNodeLink
treeNodeLink_12
=
new
TreeNodeLink
();
treeNodeLink_12
.
setNodeIdTo
(
1L
);
treeNodeLink_12
.
setNodeIdTo
(
12L
);
treeNodeLink_12
.
setRuleLimitType
(
1
);
treeNodeLink_12
.
setRuleLimitValue
(
"woman"
);
List
<
TreeNodeLink
>
treeNodeLinkList_1
=
new
ArrayList
<>();
treeNodeLinkList_1
.
add
(
treeNodeLink_11
);
treeNodeLinkList_1
.
add
(
treeNodeLink_12
);
treeNode_01
.
setTreeNodeLinkList
(
treeNodeLinkList_1
);
// 节点:11
TreeNode
treeNode_11
=
new
TreeNode
();
treeNode_11
.
setTreeId
(
10001L
);
treeNode_11
.
setTreeNodeId
(
11L
);
treeNode_11
.
setNodeType
(
1
);
treeNode_11
.
setNodeValue
(
null
);
treeNode_11
.
setRuleKey
(
"userAge"
);
treeNode_11
.
setRuleDesc
(
"用户年龄"
);
// 链接:11->111
TreeNodeLink
treeNodeLink_111
=
new
TreeNodeLink
();
treeNodeLink_111
.
setNodeIdFrom
(
11L
);
treeNodeLink_111
.
setNodeIdTo
(
111L
);
treeNodeLink_111
.
setRuleLimitType
(
3
);
treeNodeLink_111
.
setRuleLimitValue
(
"25"
);
// 链接:11->112
TreeNodeLink
treeNodeLink_112
=
new
TreeNodeLink
();
treeNodeLink_112
.
setNodeIdFrom
(
11L
);
treeNodeLink_112
.
setNodeIdTo
(
112L
);
treeNodeLink_112
.
setRuleLimitType
(
5
);
treeNodeLink_112
.
setRuleLimitValue
(
"25"
);
List
<
TreeNodeLink
>
treeNodeLinkList_11
=
new
ArrayList
<>();
treeNodeLinkList_11
.
add
(
treeNodeLink_111
);
treeNodeLinkList_11
.
add
(
treeNodeLink_112
);
treeNode_11
.
setTreeNodeLinkList
(
treeNodeLinkList_11
);
// 节点:12
TreeNode
treeNode_12
=
new
TreeNode
();
treeNode_12
.
setTreeId
(
10001L
);
treeNode_12
.
setTreeNodeId
(
12L
);
treeNode_12
.
setNodeType
(
1
);
treeNode_12
.
setNodeValue
(
null
);
treeNode_12
.
setRuleKey
(
"userAge"
);
treeNode_12
.
setRuleDesc
(
"用户年龄"
);
// 链接:12->121
TreeNodeLink
treeNodeLink_121
=
new
TreeNodeLink
();
treeNodeLink_121
.
setNodeIdFrom
(
12L
);
treeNodeLink_121
.
setNodeIdTo
(
121L
);
treeNodeLink_121
.
setRuleLimitType
(
3
);
treeNodeLink_121
.
setRuleLimitValue
(
"25"
);
// 链接:12->122
TreeNodeLink
treeNodeLink_122
=
new
TreeNodeLink
();
treeNodeLink_122
.
setNodeIdFrom
(
12L
);
treeNodeLink_122
.
setNodeIdTo
(
122L
);
treeNodeLink_122
.
setRuleLimitType
(
5
);
treeNodeLink_122
.
setRuleLimitValue
(
"25"
);
List
<
TreeNodeLink
>
treeNodeLinkList_12
=
new
ArrayList
<>();
treeNodeLinkList_12
.
add
(
treeNodeLink_121
);
treeNodeLinkList_12
.
add
(
treeNodeLink_122
);
treeNode_12
.
setTreeNodeLinkList
(
treeNodeLinkList_12
);
// 节点:111
TreeNode
treeNode_111
=
new
TreeNode
();
treeNode_111
.
setTreeId
(
10001L
);
treeNode_111
.
setTreeNodeId
(
111L
);
treeNode_111
.
setNodeType
(
2
);
treeNode_111
.
setNodeValue
(
"果实A"
);
// 节点:112
TreeNode
treeNode_112
=
new
TreeNode
();
treeNode_112
.
setTreeId
(
10001L
);
treeNode_112
.
setTreeNodeId
(
112L
);
treeNode_112
.
setNodeType
(
2
);
treeNode_112
.
setNodeValue
(
"果实B"
);
// 节点:121
TreeNode
treeNode_121
=
new
TreeNode
();
treeNode_121
.
setTreeId
(
10001L
);
treeNode_121
.
setTreeNodeId
(
121L
);
treeNode_121
.
setNodeType
(
2
);
treeNode_121
.
setNodeValue
(
"果实C"
);
// 节点:122
TreeNode
treeNode_122
=
new
TreeNode
();
treeNode_122
.
setTreeId
(
10001L
);
treeNode_122
.
setTreeNodeId
(
122L
);
treeNode_122
.
setNodeType
(
2
);
treeNode_122
.
setNodeValue
(
"果实D"
);
// 树根
TreeRoot
treeRoot
=
new
TreeRoot
();
treeRoot
.
setTreeId
(
10001L
);
treeRoot
.
setTreeRootNodeId
(
1L
);
treeRoot
.
setTreeName
(
"规则决策树"
);
Map
<
Long
,
TreeNode
>
treeNodeMap
=
new
HashMap
<>();
treeNodeMap
.
put
(
1L
,
treeNode_01
);
treeNodeMap
.
put
(
11L
,
treeNode_11
);
treeNodeMap
.
put
(
12L
,
treeNode_12
);
treeNodeMap
.
put
(
111L
,
treeNode_111
);
treeNodeMap
.
put
(
112L
,
treeNode_112
);
treeNodeMap
.
put
(
121L
,
treeNode_121
);
treeNodeMap
.
put
(
122L
,
treeNode_122
);
treeRich
=
new
TreeRich
(
treeRoot
,
treeNodeMap
);
}
@Test
public
void
test_tree
()
{
logger
.
info
(
"决策树组合结构信息:\r\n"
+
JSON
.
toJSONString
(
treeRich
));
IEngine
treeEngineHandle
=
new
TreeEngineHandle
();
Map
<
String
,
String
>
decisionMatter
=
new
HashMap
<>();
decisionMatter
.
put
(
"gender"
,
"man"
);
decisionMatter
.
put
(
"age"
,
"29"
);
EngineResult
result
=
treeEngineHandle
.
process
(
10001L
,
"Oli09pLkdjh"
,
treeRich
,
decisionMatter
);
logger
.
info
(
"测试结果:{}"
,
JSON
.
toJSONString
(
result
));
}
}
pom.xml
浏览文件 @
13faa897
...
@@ -28,6 +28,8 @@
...
@@ -28,6 +28,8 @@
<module>
itstack-demo-design-7-01
</module>
<module>
itstack-demo-design-7-01
</module>
<module>
itstack-demo-design-02
</module>
<module>
itstack-demo-design-02
</module>
<module>
itstack-demo-design-7-02
</module>
<module>
itstack-demo-design-7-02
</module>
<module>
itstack-demo-design-8-01
</module>
<module>
itstack-demo-design-8-02
</module>
</modules>
</modules>
<dependencies>
<dependencies>
...
@@ -35,7 +37,7 @@
...
@@ -35,7 +37,7 @@
<dependency>
<dependency>
<groupId>
com.alibaba
</groupId>
<groupId>
com.alibaba
</groupId>
<artifactId>
fastjson
</artifactId>
<artifactId>
fastjson
</artifactId>
<version>
1.2.6
8
</version>
<version>
1.2.6
2
</version>
</dependency>
</dependency>
<dependency>
<dependency>
<groupId>
junit
</groupId>
<groupId>
junit
</groupId>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录