pipeline

pipeline 模式,它将一系列的小命令组合成一个大的命令,它可以将***一个大命令拆分为一个一个的高内聚的小命令***,我们可以使用这一系列的小命令组合更多更复杂的命令。

下面给出一个需求,我们将这个需求写成 pipeline 的模式。

需求是:对一个 int 的切片做 “平方”,“过滤奇函数”,“求和” 的操作,并且使用 pipeline 的方式去调用这一系列的高内聚的小函数。

// 初始函数
func echo(data []int) chan int {
	out := make(chan int)
	go func() {
		for _, v := range data {
			out <- v
		}
		close(out)
	}()
	return out
}

// 平方
func sq(in chan int) chan int {
	out := make(chan int)
	go func() {
		for v := range in {
			out <- v * v
		}
		close(out)
	}()
	return out
}

// 过滤奇函数
func odd(in chan int) chan int {
	out := make(chan int)
	go func() {
		for v := range in {
			if v%2 != 0 {
				out <- v
			}
		}
		close(out)
	}()
	return out
}
// 求和

func sum(in chan int) chan int {
	out := make(chan int)
	go func() {
		sum := 0
		for v := range in {
			sum += v
		}
		out <- sum
		close(out)
	}()
	return out
}

type EchoFunction func ([]int) (<- chan int) 
type PipeFunction func (<- chan int) (<- chan int) 

// pipeline 处理
func Handle(a []int, e EchoFunction, ps ...PipeFunction) chan int {
	ch := e(a)
	for _, v := range ps {
		ch = v(ch)
	}
	return ch
}

// main函数
func main() {
	a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	data := <-Handle(a, echo, sq, odd, sum)
	fmt.Println(data)
}