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