go设计模式之策略模式浅谈

go_hiro · · 2062 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

### 策略模式 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换 ### 策略模式与状态模式的区别联系 查看知乎上的一篇文字[状态模式和策略模式的区别与联系](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! ``` 以上的就叫:策略模式!

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2062 次点击  ∙  1 赞  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传