22.Golang设计模式之策略模式

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

策略模式

GitHub代码链接
策略模式(Strategy Pattern),一个类的行为或其算法可以在运行时改变。

什么是策略模式

策略模式定义一系列算法,把他们一个一个封装起来,并且使他可相互替换。

解决了什么问题

解决了在多种算法相似的情况下,使用if...else所带来的复杂和难以维护。策略模式
将这些算法封装成一个一个的类,任意的替换。

优点

  • 算法可自由切换
  • 避免多重条件判断
  • 扩展性良好

缺点

  • 策略类会增多
  • 所有策略类都需要对外暴露

代码实现

1. 新建策略类接口

//Strategy 策略类接口
type Strategy interface {
    DoOperation(num1, num2 int) int
}

2. 实现三个策略类

//OperationAdd 加法策略类
type OperationAdd struct{}

//NewOperationAdd 实例化加法策略类
func NewOperationAdd() *OperationAdd {
    return &OperationAdd{}
}

//DoOperation 执行策略操作
func (add *OperationAdd) DoOperation(num1, num2 int) int {
    return num1 + num2
}

//OperationSubtract 减法策略类
type OperationSubtract struct{}

//NewOperationSubtract 实例化减法策略类
func NewOperationSubtract() *OperationSubtract {
    return &OperationSubtract{}
}

//DoOperation 减法策略类执行的操作
func (sub *OperationSubtract) DoOperation(num1, num2 int) int {
    return num1 - num2
}

//OperationMultiply 乘法策略类
type OperationMultiply struct{}

//NewOperationMultiply 实例化乘法策略类
func NewOperationMultiply() *OperationMultiply {
    return &OperationMultiply{}
}

//DoOperation 乘法策略类执行操作
func (multi *OperationMultiply) DoOperation(num1, num2 int) int {
    return num1 * num2
}

3. 实现策略的使用者类

//Context 策略的使用类
type Context struct {
    strategy Strategy
}

//NewContext 实例化策略使用类
func NewContext(str Strategy) *Context {
    return &Context{
        strategy: str,
    }
}

//ExecuteStrategy 执行当前策略
func (c *Context) ExecuteStrategy(num1, num2 int) int {
    return c.strategy.DoOperation(num1, num2)
}

4. 测试

func StrategyTest(t *testing.T) {
    context := NewContext(NewOperationAdd())
    fmt.Println("11 + 6 = ", context.ExecuteStrategy(11, 6))

    context = NewContext(NewOperationSubtract())
    fmt.Println("12 - 7 =", context.ExecuteStrategy(12, 7))

    context = NewContext(NewOperationMultiply())
    fmt.Println("12 * 11 =", context.ExecuteStrategy(12, 11))
}

上一篇

20.Golang设计模式之状态模式

下一篇


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

本文来自:简书

感谢作者:ShawnLee_123

查看原文:22.Golang设计模式之策略模式

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

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