原理
在策略模式(Strategy Pattern)中,一個類的行爲或其算法可以在運行時更改。這種類型的設計模式屬於行爲型模式。
在策略模式中,我們創建表示各種策略的對象和一個行爲隨着策略對象改變而改變的 context 對象。策略對象改變context 對象的執行算法。
意圖
定義一系列的算法,把它們一個個封裝起來, 並且使它們可相互替換。
主要解決
在有多種算法相似的情況下,使用 if…else 所帶來的複雜和難以維護
應用實例:
1、諸葛亮的錦囊妙計,每一個錦囊就是一個策略。 2、旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略。
代碼
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 策略模式
{
class Program
{
static void Main(string[] args)
{
Context c = new Context("A");
c.GetResult();
Context b = new Context("B");
b.GetResult();
Console.ReadKey();
}
}
}
Strategy.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 策略模式
{
//策略和簡單工廠結合
class Context
{
Strategy st = null;
public Context(string type)
{
switch (type)
{
case "A":
st = new ConcreteStartegyA();
break;
case "B":
st = new ConcreteStartegyB();
break;
case "C":
st = new ConcreteStartegyC();
break;
}
}
public void GetResult()
{
st.AlgorithmInterface();
}
}
//抽象算法類
abstract class Strategy
{
//算法方法
public abstract void AlgorithmInterface();
}
//具體算法A
class ConcreteStartegyA : Strategy
{
//算法A實現方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法A實現");
}
}
//具體算法B
class ConcreteStartegyB : Strategy
{
//算法B實現方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法B實現");
}
}
//具體算法C
class ConcreteStartegyC : Strategy
{
//算法C實現方法
public override void AlgorithmInterface()
{
Console.WriteLine("算法C實現");
}
}
}
參考
參考書籍:《大話設計模式》
參考鏈接: 菜鳥教程.