前言 策略模式定義了一系列演算法,並將每個演算法封裝起來,使它們可以互相替換,且演算法的變換不會影響使用演算法的客戶。 在項目開發中,我們經常要根據不同的場景,採取不同的措施,也就是不同的策略。假設我們需要對a、b這兩個整數進行計算,根據條件的不同,需要執行不同的計算方式。我們可以把所有的操作都封裝在同一個 ...
前言
策略模式定義了一系列演算法,並將每個演算法封裝起來,使它們可以互相替換,且演算法的變換不會影響使用演算法的客戶。
在項目開發中,我們經常要根據不同的場景,採取不同的措施,也就是不同的策略。假設我們需要對a、b這兩個整數進行計算,根據條件的不同,需要執行不同的計算方式。我們可以把所有的操作都封裝在同一個函數中,然後根據if ... else ...
的形式來調用不同的計算方式,這種方式稱為硬編碼。
在實際應用中,隨著功能和體驗的不斷增長,我們需要經常添加/修改策略,進而需要不斷修改已有代碼,這不僅會讓這個函數越來越難以維護,還會因為修改帶來一些Bug。因此,為瞭解耦,我們需要使用策略模式,定義一些獨立的類來封裝不同的演算法,每一個類封裝一個具體的演算法。
示例代碼
策略模式的重點在於策略的設定,以及普通類Operator
和策略CalStrategy
的對接。通過更換實現同一介面的不同策略類。降低了Operator
的維護成本,解耦演算法實現。
Go
strategy.go
package strategy
// CalStrategy 是一個策略類
type CalStrategy interface {
do(int, int) int
}
// Add 為加法策略
type Add struct{}
func (*Add) do(a, b int) int {
return a + b
}
// Reduce 為減法策略
type Reduce struct{}
func (*Reduce) do(a, b int) int {
return a - b
}
// Operator 是具體的策略執行者
type Operator struct {
strategy CalStrategy
}
// 設置策略
func (o *Operator) setStrategy(strategy CalStrategy) {
o.strategy = strategy
}
// 調用策略中的方法
func (o *Operator) calc(a, b int) int {
return o.strategy.do(a, b)
}
單元測試
package strategy
import "testing"
func TestStrategy(t *testing.T) {
operator := Operator{}
operator.setStrategy(&Add{})
if operator.calc(1, 2) != 3 {
t.Fatal("Add strategy error")
}
operator.setStrategy(&Reduce{})
if operator.calc(2, 1) != 1 {
t.Fatal("Reduce strategy error")
}
}
Python
from abc import ABC, abstractmethod
class CalStrategy(ABC):
"""策略類
"""
@abstractmethod
def do(self, a: int, b: int) -> int:
pass
class Add(CalStrategy):
"""加法策略
"""
def do(self, a: int, b: int) -> int:
return a + b
class Reduce(CalStrategy):
"""減法策略
"""
def do(self, a: int, b: int) -> int:
return a - b
class Operator:
"""策略執行者
"""
def __init__(self):
self.strategy = None
def set_strategy(self, strategy: CalStrategy):
"""設置策略
"""
self.strategy = strategy
def calc(self, a: int, b: int) -> int:
"""調用策略中的方法
"""
return self.strategy.do(a, b)
if __name__ == "__main__":
operator = Operator()
operator.set_strategy(Add())
print(operator.calc(1, 2))
operator.set_strategy(Reduce())
print(operator.calc(4, 3))
參考
- 孔令飛 - 企業級Go項目開發實戰
本文來自博客園,作者:花酒鋤作田,轉載請註明原文鏈接:https://www.cnblogs.com/XY-Heruo/p/18019973