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 &Managernil
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模式-责任链的主要内容,如果未能解决你的问题,请参考以下文章