设计模式之策略模式
背景说明
tip
在数据统计中,不同类都可以实现统一的fetchUser方法
策略模式的一个重要特征
策略模式的定义:是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。
Strategy Pattern
典型代码
package main
import "fmt"
// 执行策略接口
type ExecuteStrategy interface {
Execute(a, b int) int
}
// 描述策略接口
type DescriptionStrategy interface {
Description() string
}
// 组合接口
type Strategy interface {
ExecuteStrategy
DescriptionStrategy
}
// 具体策略:加法
type AddStrategy struct{}
func (s *AddStrategy) Execute(a, b int) int {
return a + b
}
func (s *AddStrategy) Description() string {
return "加法策略"
}
// 具体策略:减法
type SubtractStrategy struct{}
func (s *SubtractStrategy) Execute(a, b int) int {
return a - b
}
// 上下文
type Context struct {
strategy ExecuteStrategy
}
// 设置策略
func (c *Context) SetStrategy(strategy ExecuteStrategy) {
c.strategy = strategy
}
// 执行策略
func (c *Context) ExecuteStrategy(a, b int) int {
return c.strategy.Execute(a, b)
}
// 获取策略描述
func (c *Context) GetStrategyDescription() string {
if descStrategy, ok := c.strategy.(DescriptionStrategy); ok {
return descStrategy.Description()
}
return "无描述"
}
func main() {
context := &Context{}
// 使用加法策略
addStrategy := &AddStrategy{}
context.SetStrategy(addStrategy)
fmt.Println("10 + 5 =", context.ExecuteStrategy(10, 5))
fmt.Println("当前策略:", context.GetStrategyDescription())
// 使用减法策略
subtractStrategy := &SubtractStrategy{}
context.SetStrategy(subtractStrategy)
fmt.Println("10 - 5 =", context.ExecuteStrategy(10, 5))
fmt.Println("当前策略:", context.GetStrategyDescription())
}
优缺点
优点
- 运行时切换对象内的算法。
- 使用组合来代替继承。
- 无需对上下文进行修改就能够引入新的策略。
缺点
- 你的算法极少发生改变, 那么没有任何理由引入新的类和接口。 使用该模式只会让程序过于复杂。
- 客户端必须知晓策略间的不同——它需要选择合适的策略
- 现代编程语言支持函数类型功能, 允许你在一组匿名函数中实现不同版本的算法