策略模式
策略模式定义了算法族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化独立于使用算法的客户。
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这部分变化从原来的代码逻辑独立出来,方便后期扩展。