设计模式-17-策略模式

策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换

业务逻辑

Strategy

代码实现

代码路径:https://github.com/XBoom/DesignPatterns/tree/main/16_Strategy

  1. 定义一个策略接口,其中包含一个方法 Execute(),代表具体的算法

    1
    2
    3
    4
    // Strategy 策略接口
    type Strategy interface {
    Execute(num1, num2 int) int
    }
  2. 创建多个实现了策略接口的具体策略类,分别实现不同的算法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // ConcreteStrategyAdd 具体策略类 - 加法
    type ConcreteStrategyAdd struct{}

    func (s *ConcreteStrategyAdd) Execute(num1, num2 int) int {
    return num1 + num2
    }

    // ConcreteStrategySubtract 具体策略类 - 减法
    type ConcreteStrategySubtract struct{}

    func (s *ConcreteStrategySubtract) Execute(num1, num2 int) int {
    return num1 - num2
    }
  3. 创建一个上下文结构体,用于调用具体的算法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Context 上下文类
    type Context struct {
    strategy Strategy
    }

    func (c *Context) SetStrategy(strategy Strategy) {
    c.strategy = strategy
    }

    func (c *Context) ExecuteStrategy(num1, num2 int) int {
    return c.strategy.Execute(num1, num2)
    }

运行

1
2
3
4
5
6
7
8
9
10
11
context := &Context{}

// 使用加法策略
context.SetStrategy(&ConcreteStrategyAdd{})
result := context.ExecuteStrategy(10, 5)
fmt.Println("加法策略结果:", result) // Output: 加法策略结果: 15

// 使用减法策略
context.SetStrategy(&ConcreteStrategySubtract{})
result = context.ExecuteStrategy(10, 5)
fmt.Println("减法策略结果:", result) // Output: 减法策略结果: 5

结果

1
2
加法策略结果: 15
减法策略结果: 5

总结

  • 当想使用对象中各种不同的算法变体,并希望能在运行时切换算法时
  • 可以将算法的实现和使用算法的代码隔离开来
  • 开闭原则。 无需对上下文进行修改就能够引入新的策略

参考链接

  1. https://refactoringguru.cn/design-patterns/strategy
  2. https://lailin.xyz/post/strategy.html