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

go模式-责任链

go模式-责任链

责任链模式

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

设计模式15--从审批流中学习责任链模式

设计模式15--从审批流中学习责任链模式