策略模式
GitHub代碼鏈接
策略模式(Strategy Pattern)戏挡,一個類的行為或其算法可以在運行時改變惊暴。
什么是策略模式
策略模式定義一系列算法脐瑰,把他們一個一個封裝起來朴恳,并且使他可相互替換闹击。
解決了什么問題
解決了在多種算法相似的情況下,使用if...else所帶來的復(fù)雜和難以維護(hù)贩疙。策略模式
將這些算法封裝成一個一個的類掀泳,任意的替換。
優(yōu)點
- 算法可自由切換
- 避免多重條件判斷
- 擴(kuò)展性良好
缺點
- 策略類會增多
- 所有策略類都需要對外暴露
代碼實現(xiàn)
1. 新建策略類接口
//Strategy 策略類接口
type Strategy interface {
DoOperation(num1, num2 int) int
}
2. 實現(xiàn)三個策略類
//OperationAdd 加法策略類
type OperationAdd struct{}
//NewOperationAdd 實例化加法策略類
func NewOperationAdd() *OperationAdd {
return &OperationAdd{}
}
//DoOperation 執(zhí)行策略操作
func (add *OperationAdd) DoOperation(num1, num2 int) int {
return num1 + num2
}
//OperationSubtract 減法策略類
type OperationSubtract struct{}
//NewOperationSubtract 實例化減法策略類
func NewOperationSubtract() *OperationSubtract {
return &OperationSubtract{}
}
//DoOperation 減法策略類執(zhí)行的操作
func (sub *OperationSubtract) DoOperation(num1, num2 int) int {
return num1 - num2
}
//OperationMultiply 乘法策略類
type OperationMultiply struct{}
//NewOperationMultiply 實例化乘法策略類
func NewOperationMultiply() *OperationMultiply {
return &OperationMultiply{}
}
//DoOperation 乘法策略類執(zhí)行操作
func (multi *OperationMultiply) DoOperation(num1, num2 int) int {
return num1 * num2
}
3. 實現(xiàn)策略的使用者類
//Context 策略的使用類
type Context struct {
strategy Strategy
}
//NewContext 實例化策略使用類
func NewContext(str Strategy) *Context {
return &Context{
strategy: str,
}
}
//ExecuteStrategy 執(zhí)行當(dāng)前策略
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))
}