go模式-责任链
Posted 文大侠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go模式-责任链相关的知识,希望对你有一定的参考价值。
所谓责任链也就是一组任务执行,每个任务输入是上一个任务输出,每个任务输出是下个任务输入,每个任务完成自己负责部分,相当于一个管道串接起来完成任务,因此也叫pipe filter ,常用于任务编排。
实现如下,Manager依次处理IProcessor接口任务,每个任务处理自己责任,处理前对自己的输入校验确保是自己能处理的。
该程序的处理责任如下
将字符串“1,2,3,4,5,6,7”按照逗号分割,转成数字数组,然后计算累加结果,分别对应SplitProcessor、ToNumProcessor、SumProcessor实现。
//--------------------------------------------------IProcessor--------------------------------------------------
type IProcessor interface {
Process(params interface{}) (error, interface{})
}
type SplitProcessor struct{}
func (p *SplitProcessor) Process(params interface{}) (error, interface{}) {
if v, ok := params.(string); !ok {
return errors.New("SplitProcessor input type error "), nil
} else {
return nil, strings.Split(v, ",")
}
}
type ToNumProcessor struct{}
func (p *ToNumProcessor) Process(params interface{}) (error, interface{}) {
if v, ok := params.([]string); !ok {
return errors.New("ToNumProcessor input type error "), nil
} else {
ret := make([]int, 0)
for _, str := range v {
if iv, err := strconv.Atoi(str); err != nil {
return errors.New("ToNumProcessor convert type error "), nil
} else {
ret = append(ret, iv)
}
}
return nil, ret
}
}
type SumProcessor struct{}
func (p *SumProcessor) Process(params interface{}) (error, interface{}) {
if v, ok := params.([]int); !ok {
return errors.New("SumProcessor input type error "), nil
} else {
var ret int
for _, value := range v {
ret = ret + value
}
return nil, ret
}
}
//--------------------------------------------------Manager--------------------------------------------------
type Manager struct {
ps []IProcessor
}
func NewManager() *Manager {
return &Manager{nil}
}
func (m *Manager) AddProcessor(processor IProcessor) {
m.ps = append(m.ps, processor)
}
func (m *Manager) Run(params interface{}) (error, interface{}) {
ret := params
var err error
for _, v := range m.ps {
err, ret = v.Process(ret)
if err != nil {
return err, nil
}
}
return nil, ret
}
//--------------------------------------------------Test--------------------------------------------------
func TestManager(t *testing.T) {
m := NewManager()
m.AddProcessor(&SplitProcessor{})
m.AddProcessor(&ToNumProcessor{})
m.AddProcessor(&SumProcessor{})
err, ret := m.Run("1,2,3,4,5,6,7")
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("Result %v\\n", ret)
}
err, ret = m.Run(1234)
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("Result %v\\n", ret)
}
err, ret = m.Run("1,2,asd,xxx,5,6,7")
if err != nil {
fmt.Println(err)
} else {
fmt.Printf("Result %v\\n", ret)
}
}
原创,转载请注明来自
以上是关于go模式-责任链的主要内容,如果未能解决你的问题,请参考以下文章