策略模式——定义算法族,分别封装起来,让他们直接可以互相替换,此模式让算法的变化独立于使用算法的客户。
现在看一个例子:
现在有一个王子,要让他有攻击的技能,王子可以选择剑、斧头、枪等武器进行攻击。
在不适用策略模式的情况下我会这么写:
type prince struct {
name string
}
func (pr *prince)attachWithSword() {
fmt.Println("attach with a sword")
}
func (pr *prince)attachWithAxe() {
fmt.Println("attach with a axe")
}
func main() {
me := prince{"大狮"}
me.attachWithSword()
me.attachWithAxe()
}
代码非常简单,但是这样的代码扩展性非常差。比如我们如果要加上长枪的攻击效果则要继续给prince结构体增加方法,在具体调用的地方也要加上新的调用方式。
上面的方法实际上违反了设计原则中的开闭原则。一个软件应该对扩展开放,对修改关闭。即软件实体应该尽量在不修改原有代码的情况下进行扩展。(这个例子在go中体会不深,因为go没有类的概念,方法都是在结构体外增加的)
使用策略模式后
package main
import "fmt"
type weapone interface{
attack()
}
type prince struct {
name string
wp weapone
}
func (pr *