說明:
將不同的演算法,定義成一個家族,
這些演算法實現同樣的接口,且寫成個別的類別,所以彼此之間能夠互相替換。
優點是以後要增加新的演算法,只須額外新增一個類別,不須動到原本的類別。
範例:
商店在不同的時期,常會有不同的折扣活動。假設有「打8折」、「打7折」、「滿200打6折」,這些不同的算法則可用策略模式來實做,以後如果又有新的折扣活動,只須再新增一個算法類別即可,不須更動到原本的計算類別。
希望達成如下的效果
static void Main(string[] args)
{
CashContext cc;
// 打8折的時候
cc = new CashContext(new ConcreteStrategyA());
cc.ExecuteStrategy(100);
// 打7折的時候
cc = new CashContext(new ConcreteStrategyB());
cc.ExecuteStrategy(100);
// 滿200打6折的時候
cc = new CashContext(new ConcreteStrategyC());
cc.ExecuteStrategy(200);
Console.Read();
}
執行結果: 原價 100, 打8折 = 80
原價 100, 打7折 = 70
原價 200, 滿200打6折 = 120
實現重點在於,演算法要實現同樣的接口,才能讓 context 類別能用同樣的方式,操作不同的演算法。
其餘程式碼
// 策略介面,定義一個演算法要實做的方法
interface Strategy
{
void Execute(int money);
}
// 第一種算法,打 8 折
class ConcreteStrategyA : Strategy
{
public void Execute(int money)
{
double res = money * 0.8;
Console.WriteLine("原價 {0}, 打8折 = {1}", money, res);
}
}
// 第二種算法,打 7 折
class ConcreteStrategyB : Strategy
{
public void Execute(int money)
{
double res = money * 0.7;
Console.WriteLine("原價 {0}, 打7折 = {1}", money, res);
}
}
// 第三種算法,滿 200 打 6 折
class ConcreteStrategyC : Strategy
{
public void Execute(int money)
{
double res = (money >= 200) ? money * 0.6 : money;
Console.WriteLine("原價 {0}, 滿200打6折 = {1}", money, res);
}
}
// 用來維護策略物件的類別
class CashContext
{
Strategy strategy; // 算法物件
public CashContext(Strategy strategy)
{
this.strategy = strategy;
}
public void ExecuteStrategy(int money)
{
this.strategy.Execute(money);
}
}
相關連結:設計模式整理列表
沒有留言:
張貼留言