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

go_hiro · 2021-04-28 17:45:23 · 2267 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2021-04-28 17:45:23 的文章,其中的信息可能已经有所发展或是发生改变。

策略模式

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换

策略模式与状态模式的区别联系

查看知乎上的一篇文字状态模式和策略模式的区别与联系 本文也是参考这篇文章的想法,通过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式,今天到底要用哪一式呢?于是我的代码变成了这样

type My struct{}
func (c *My) Papa1() {
    fmt.Println("啪啪啪1...")
}
func (c *My) Papa2() {
    fmt.Println("啪啪啪2...")
}
//等等.....招式

但代码如果是这样的,宝宝肯会被老板开掉的。但宝宝发现,啪啪啪的方式其实取决于我的妹子。对两种不同类型的妹子,我的表现是不同的。

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吧“。接下来发生的事,我只要闭上眼睛享受就好了。

type My struct{}
//注意这里的形参为Girl接口
func (c *My) Papa(girl Girl) {
    girl.Love()
}

于是,你懂的:

//周一
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

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