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

go模式-责任链

go模式-责任链

责任链模式

java 哪些框架用到了责任链模式

设计模式责任链模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

我好像发现了一个Go的Bug?