77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
package main
|
||
|
||
import "fmt"
|
||
|
||
/*
|
||
实例:
|
||
汤宝宝申请报销款,需要走产品经理、部门经理和总经理的审核~
|
||
*/
|
||
|
||
type Manager struct {
|
||
name string
|
||
successor *Manager // successor表示下一级经理
|
||
amount float64
|
||
}
|
||
|
||
func (m *Manager) SetSuccessor(successor *Manager) {
|
||
m.successor = successor
|
||
fmt.Printf("%s的下一级经理是%s\n", m.name, successor.name)
|
||
}
|
||
|
||
func (m *Manager) SetAmountRight(amount float64) {
|
||
m.amount = amount
|
||
fmt.Printf("%s的报销权限是%.2f元\n", m.name, amount)
|
||
}
|
||
|
||
func (m *Manager) HaveRight(amount float64) bool {
|
||
|
||
if amount <= m.amount {
|
||
fmt.Printf("%s有权限审批%.2f元的报销请求\n", m.name, amount)
|
||
return true
|
||
}
|
||
fmt.Printf("%s没有权限审批%.2f元的报销请求\n", m.name, amount)
|
||
return false
|
||
}
|
||
|
||
func (m *Manager) Approve(name string, amount float64) {
|
||
fmt.Printf("%s提交了一笔%.2f元的报销请求\n", name, amount)
|
||
if m.HaveRight(amount) {
|
||
fmt.Printf("%s审批通过了%s的报销请求,金额为%.2f元\n", m.name, name, amount)
|
||
} else if m.successor != nil {
|
||
fmt.Printf("%s将%s的报销请求上报给%s审批\n", m.name, name, m.successor.name)
|
||
m.successor.Approve(name, amount)
|
||
} else {
|
||
fmt.Printf("没有合适的经理审批%s的报销请求,金额为%.2f元\n", name, amount)
|
||
}
|
||
}
|
||
|
||
func main() {
|
||
fmt.Println("========= 责任链模式 =========")
|
||
// 创建经理
|
||
pm := &Manager{name: "产品经理"}
|
||
pm.SetAmountRight(1000)
|
||
|
||
dm := &Manager{name: "部门经理"}
|
||
dm.SetAmountRight(5000)
|
||
|
||
gm := &Manager{name: "总经理"}
|
||
gm.SetAmountRight(20000)
|
||
|
||
// 设置责任链
|
||
pm.SetSuccessor(dm)
|
||
dm.SetSuccessor(gm)
|
||
|
||
// 提交报销请求
|
||
fmt.Println("-----")
|
||
pm.Approve("汤宝宝", 800)
|
||
fmt.Println("-----")
|
||
pm.Approve("汤宝宝", 3000)
|
||
fmt.Println("-----")
|
||
pm.Approve("汤宝宝", 15000)
|
||
fmt.Println("-----")
|
||
pm.Approve("汤宝宝", 25000)
|
||
|
||
fmt.Println()
|
||
fmt.Println("======= 责任链模式结束 =======")
|
||
}
|