### 策略模式
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
### 策略模式与状态模式的区别联系
查看知乎上的一篇文字[状态模式和策略模式的区别与联系](https://www.zhihu.com/question/23693088)
本文也是参考这篇文章的想法,通过go语言翻译出来,如有不合适,请找知乎冤大头,哈哈
### 与状态模式类似
本质上讲,策略模式和状态模式做得是同一件事:去耦合。怎么去耦合?
就是把干什么(语境类)和怎么干(策略接口)分开,互不依赖。打个比方,下面是我一天的行程:
```go
type My struct{}
func (c *My) Eat() {
fmt.Println("吃饭中...")
}
func (c *My) Shopping() {
fmt.Println("逛街中...")
}
func (c *My) Sleep() {
fmt.Println("睡觉中...")
}
func (c *My) Papa() {
fmt.Println("啪啪啪...")
}
```
但问题来了,啪啪啪是个技术活,有著名的48式,今天到底要用哪一式呢?于是我的代码变成了这样
```go
type My struct{}
func (c *My) Papa1() {
fmt.Println("啪啪啪1...")
}
func (c *My) Papa2() {
fmt.Println("啪啪啪2...")
}
//等等.....招式
```
但代码如果是这样的,宝宝肯会被老板开掉的。但宝宝发现,啪啪啪的方式其实取决于我的妹子。对两种不同类型的妹子,我的表现是不同的。
```go
type Girl interface {
Love()
}
//可爱型妹子
type Cutey struct{}
func (*Cutey) Love() {
fmt.Println("Ya Mie Die!")
}
//外国妹子
type Foreigner struct{}
func (*Foreigner) Love() {
fmt.Println("Come on!")
}
```
而且我惊讶地发现,所有妹子都把啪啪啪叫做”Love“。所以只要我只要知道今天晚上是和哪个妹子在一起,根据多态性,我只要说同一句话:”妹子让我们Love吧“。接下来发生的事,我只要闭上眼睛享受就好了。
```go
type My struct{}
//注意这里的形参为Girl接口
func (c *My) Papa(girl Girl) {
girl.Love()
}
```
于是,你懂的:
```go
//周一
my := &My{}
my.Eat() //吃饭中...
my.Shopping() //逛街中...
my.Sleep() //睡觉中...
my.Papa(new(Cutey)) //Ya Mie Die!
//周二
my := &My{}
my.Eat() //吃饭中...
my.Shopping() //逛街中...
my.Sleep() //睡觉中...
my.Papa(new(Foreigner)) //Come on!
```
以上的就叫:策略模式!
有疑问加站长微信联系(非本文作者))