创建文件Manger.go
package chain // 主管 经理 总经理 董事长 // 20 100 150 200 type Manger interface { HaveRight(money int) bool // 判断权限 HandleFeeRequest(name string, money int) bool // 向后传递 }
创建文件RequestChain.go
package chain type RequestChain struct { Manger successor *RequestChain // 处理成功 } // 判断责任链在哪里结束 func (rc *RequestChain) SetSuccessor(endrc *RequestChain) { rc.successor = endrc } // 权利判断 func (rc *RequestChain) HaveRight(money int) bool { return true } // 向后传递,有权利当场处理,没有权利放弃,向后传递 func (rc *RequestChain) HandleFeeRequest(name string, money int) bool { if rc.Manger.HaveRight(money) { return rc.Manger.HandleFeeRequest(name, money) } if rc.successor != nil { return rc.successor.HandleFeeRequest(name, money) } return false }
创建文件ProjectManger.go
package chain import "fmt" type ProjectManger struct { } func NewProjectManger() *ProjectManger { return &ProjectManger{} } func NewProjectMangerChain() *RequestChain { return &RequestChain{&ProjectManger{}, nil} } func (pm *ProjectManger) HaveRight(money int) bool { return money < 1000 } func (pm *ProjectManger) HandleFeeRequest(name string, money int) bool { if name == "Jackey" { fmt.Printf("Project manger 授权 %s %d\n", name, money) return true } fmt.Printf("Project manger not 授权 %s %d\n", name, money) return false }
创建文件DepManger.go
package chain import "fmt" type DepManger struct { } func NewDepManger() *DepManger { return &DepManger{} } func NewDepMangerChain() *RequestChain { return &RequestChain{&DepManger{}, nil} } func (dm *DepManger) HaveRight(money int) bool { return money < 5000 } func (dm *DepManger) HandleFeeRequest(name string, money int) bool { if name == "Jackey" { fmt.Printf("dep manger 授权 %s %d\n", name, money) return true } fmt.Printf("dep manger not 授权 %s %d\n", name, money) return false }
创建文件GeneralManger.go
package chain import "fmt" type GeneralManger struct { } func NewGeneralManger() *GeneralManger { return &GeneralManger{} } func NewGeneralMangerChain() *RequestChain { return &RequestChain{&GeneralManger{}, nil} } func (gm *GeneralManger) HaveRight(money int) bool { return true } func (gm *GeneralManger) HandleFeeRequest(name string, money int) bool { if name == "Jackey" { fmt.Printf("general manger 授权 %s %d\n", name, money) return true } fmt.Printf("general manger not 授权 %s %d\n", name, money) return false }
main.go
package main import "test/design/chain" func main() { c1 := chain.NewProjectMangerChain() c2 := chain.NewDepMangerChain() c3 := chain.NewGeneralMangerChain() c1.SetSuccessor(c2) c2.SetSuccessor(c3) var c chain.Manger = c1 c.HandleFeeRequest("Jackey", 1500) }