策略模式

策略模式定义了算法族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化独立于使用算法的客户。

go不同于java,本身没有继承的概念,天然只支持接口的组合模式。符合设计原则:多用组合,少用继承。策略模式是把变化的部分抽象出来,封装成单独的接口,然后在主接口利用“委托”(组合)的方式调用变化的部分,因为变化的部分单独成一个接口,所以它的各种实现直接可以互相替换,达到随时改变,添加,删除,不会影响到已经实现的代码部分,下面是示例代码,分析也写在了注解里面

type Interface1 interface {
	Eat()
	SayHello   // 这是变化的部分,不同的对象打招呼方式不同
}

type SayHello interface {
	Hi()
}
// 下面分别是SayHello的两个实现C 和 A
type C struct {}

func (c *C)Hi() {
	fmt.Println("你好")  
}

type A struct {}

func (a *A) Hi() {
	fmt.Println("hello")
}


type Act struct {  // Act实现了Interface1,使用组合的方式,包含了SayHello的接口
	I SayHello
}

func (act *Act) Eat() {
	fmt.Println("i want eat")
}

func (act *Act) Hi() { // Act打招呼的方式委托给了SayHello处理
	act.I.Hi()
}

func (act *Act) SetI(i SayHello) {  // 提供一个方法可以随时修改打招呼的方式
	act.I = i
}

func main() {
	act := new(create.Act)
	act.I = new(create.A)
	act.Eat()
	act.Hi()
	
	act.SetI(new(create.C))
	act.Hi()
}

这样子有两个好处,以后再来一个不同的打招呼方式,直接实现SayHello就好了,在构建的Act的时候改变SayHello为具体的实现就可以;也可以通过SetI的方式修改SayHello的方式。这样就把SayHello这部分变化从原来的代码逻辑独立出来,方便后期扩展。