1
0
Fork 0
design-patterns/go/chain_of_responsibility/main.go

77 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("======= 责任链模式结束 =======")
}