go知识重新整理

This commit is contained in:
Estom
2021-09-03 05:34:34 +08:00
parent 62309f856a
commit 1bad082e49
291 changed files with 29345 additions and 2 deletions

View File

@@ -0,0 +1,119 @@
/**
* @Author:zhoutao
* @Date:2020/12/12 下午3:46
* @Desc:
*/
package chain
import "fmt"
//责任链模式:用于分离不同职责,并且动态组合相关职责
//golang因为没有继承的支持在实现责任链的时候使用链对象 涵盖 职责的方式,
//即:
//1、链对象包含当前职责对象以及下一个职责链
//2、职责对象提供接口表示 是否能处理对应请求
//3、职责对象提供处理函数的相关职责
// 同时在职责链类中实现职责接口相关函数,使职责链对象可以当做一般职责对象使用
type Manager interface {
HaveRight(money int) bool
HandleFeeRequest(name string, money int) bool
}
//
type RequestChain struct {
Manager
successor *RequestChain
}
//connected r Chain with m Chain
func (r *RequestChain) SetSuccessor(m *RequestChain) {
r.successor = m
}
func (r *RequestChain) HandleFeeRequest(name string, money int) bool {
if r.Manager.HaveRight(money) {
return r.Manager.HandleFeeRequest(name, money)
}
if r.successor != nil {
return r.successor.HandleFeeRequest(name, money)
}
return false
}
func (r *RequestChain) HaveRight(money int) bool {
return true
}
//new chain by projectManager
//职责ProjectManager
func NewProjectManagerChain() *RequestChain {
return &RequestChain{
Manager: &ProjectManager{},
}
}
type ProjectManager struct {
}
func (p *ProjectManager) HaveRight(money int) bool {
return money < 50
}
func (p *ProjectManager) HandleFeeRequest(name string, money int) bool {
if name == "bob" {
fmt.Printf("Project manager permit %s %d fee request\n", name, money)
return true
}
fmt.Printf("Project manager do not permit %s fee request\n", name, money)
return false
}
//new chain by DepManager
//职责DepManager
func NewDepManagerChain() *RequestChain {
return &RequestChain{
Manager: &DepManager{},
}
}
type DepManager struct {
}
func (d *DepManager) HaveRight(money int) bool {
return money < 5000
}
func (d *DepManager) HandleFeeRequest(name string, money int) bool {
if name == "bob" {
fmt.Printf("dep manager permit %s %d fee request\n", name, money)
return true
}
fmt.Printf("dep manager do not permit %s fee request\n", name, money)
return false
}
//new chain by GeneralManager
//职责GeneralManager
func NewGeneralManagerChain() *RequestChain {
return &RequestChain{
Manager: &GeneralManager{},
}
}
type GeneralManager struct {
}
func (g *GeneralManager) HaveRight(money int) bool {
return true
}
func (g *GeneralManager) HandleFeeRequest(name string, money int) bool {
if name == "bob" {
fmt.Printf("general manager permit %s %d fee request\n", name, money)
return true
}
fmt.Printf("general manager do not permit %s fee request\n", name, money)
return false
}

View File

@@ -0,0 +1,28 @@
/**
* @Author:zhoutao
* @Date:2020/12/13 上午9:50
* @Desc:
*/
package chain
func ExampleChain() {
//创建好每个节点的Manager
chain1 := NewProjectManagerChain()
chain2 := NewDepManagerChain()
chain3 := NewGeneralManagerChain()
//connected r Chain with m Chain
chain1.SetSuccessor(chain2)
chain2.SetSuccessor(chain3)
var c Manager = chain1
c.HandleFeeRequest("bob", 400) //Project
c.HandleFeeRequest("tom", 1400) //Dep
c.HandleFeeRequest("fool", 10000) //General
//
c.HandleFeeRequest("tony", 300) //Project
}