策略模式
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))
}