-
Notifications
You must be signed in to change notification settings - Fork 346
/
Copy pathstate.go
87 lines (70 loc) · 1.97 KB
/
state.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Package state 状态模式
// 笔记请查看: https://lailin.xyz/state.html
// 这是一个工作流的例子,在企业内部或者是学校我们经常会看到很多审批流程
// 假设我们有一个报销的流程: 员工提交报销申请 -> 直属部门领导审批 -> 财务审批 -> 结束
// 在这个审批流中,处在不同的环节就是不同的状态
// 而流程的审批、驳回就是不同的事件
package state
import "fmt"
// Machine 状态机
type Machine struct {
state IState
}
// SetState 更新状态
func (m *Machine) SetState(state IState) {
m.state = state
}
// GetStateName 获取当前状态
func (m *Machine) GetStateName() string {
return m.state.GetName()
}
func (m *Machine) Approval() {
m.state.Approval(m)
}
func (m *Machine) Reject() {
m.state.Reject(m)
}
// IState 状态
type IState interface {
// 审批通过
Approval(m *Machine)
// 驳回
Reject(m *Machine)
// 获取当前状态名称
GetName() string
}
// leaderApproveState 直属领导审批
type leaderApproveState struct{}
// Approval 获取状态名字
func (leaderApproveState) Approval(m *Machine) {
fmt.Println("leader 审批成功")
m.SetState(GetFinanceApproveState())
}
// GetName 获取状态名字
func (leaderApproveState) GetName() string {
return "LeaderApproveState"
}
// Reject 获取状态名字
func (leaderApproveState) Reject(m *Machine) {}
func GetLeaderApproveState() IState {
return &leaderApproveState{}
}
// financeApproveState 财务审批
type financeApproveState struct{}
// Approval 审批通过
func (f financeApproveState) Approval(m *Machine) {
fmt.Println("财务审批成功")
fmt.Println("出发打款操作")
}
// 拒绝
func (f financeApproveState) Reject(m *Machine) {
m.SetState(GetLeaderApproveState())
}
// GetName 获取名字
func (f financeApproveState) GetName() string {
return "FinanceApproveState"
}
// GetFinanceApproveState GetFinanceApproveState
func GetFinanceApproveState() IState {
return &financeApproveState{}
}