一、認識
策略模式Strategy:定義了算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化,不會影響到使用算法的客戶
二、使用場景說明
Strategy:聲明一個與所有支持的算法共同的接口。上下文使用此接口調用由具體策略定義的算法。
ConcreteStrategy:利用策略接口實現算法
Context:
- 用具體策略對象配置
- 維護對策略對象的引用
- 可以定義允許策略訪問其數據的接口。
三、基礎模板代碼
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 context;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
context = new Context(new ConcreteStrategyC());
context.ContextInterface();
Console.WriteLine();
Console.ReadLine();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 策略模式
{
class Context//上下文,用一個ConcreteStrategy來配置,維護一個對Strategy對象的引用
{
Strategy strategy;
public Context(Strategy strategy)//初始化時,傳入具體的策略對象
{
this.strategy = strategy;//將參數賦值給上面的Strategy的strategy
}
//上下文接口
public void ContextInterface()//根據具體的策略對象,調用其算法的方法。void爲不返回值的方法指定返回值類型。
{
strategy.AlgorithmInterface();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 策略模式
{
class ConcreteStrategyA : Strategy//具體策略類,封裝了具體的算法或行爲,繼承於Strategy
{
//算法A實現方法
public override void AlgorithmInterface()//方法重寫
{
Console.WriteLine("算法A實現");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 策略模式
{ //策略類,定義所有支持的算法的公共接口
abstract class Strategy//加abstract關鍵字,表明是抽象類,還有抽象方法需要了解
{
//抽象類不能實例化
//抽象方法是必須被子類重寫的方法
//若類中包含抽象方法,那麼類就必須定義爲抽象類,不論是否包含其他一般方法
//算法方法
public abstract void AlgorithmInterface();
//在方法返回值前加abstract表明此方法是抽象方法,抽象方法沒有方法體,直接在括號後加“;”
}
}