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


本文摘自网络,作者go_hiro,侵删。

策略模式

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

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

查看知乎上的一篇文字状态模式和策略模式的区别与联系 本文也是参考这篇文章的想法,通过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!

以上的就叫:策略模式!


相关阅读 >>

解析Golang iris怎么使用

详解Golang string和[]byte的对比

Go学习笔记(一):Go语言开发环境搭建

Golang两个协程交替输出

基于原论文,我实现了一个更全面的布谷鸟过滤器

使用Go defer时要注意这两处!

Golang格式化符号%b是什么意思

聊聊nacos-coredns-plugin的servermanager

Go - 实现项目内链路追踪(二)

Golang 和 php 哪个性能更强?

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...