定義一系列演算法,分別封裝並使其可互換,讓演算法可獨立於使用它的 Client 而變化。
新聞列表頁:顯示所有新聞。搜尋頁:依關鍵字過濾。分頁頁:分頁顯示。若寫在 ShowData 內部用 if-else 判斷,導致方法膨脹、難維護、違反開閉原則。策略模式將各演算法封裝為獨立類別。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace StrategyExample
{
class Program
{
static void Main(string[] args)
{
Data data = new Data();
data.Add("aaa"); data.Add("bbb"); data.Add("ccc"); data.Add("abc");
data.Show(); // 預設顯示全部
data.SetShowDataStrategy(new SearchData("a"));
data.Show(); // 搜尋含 'a'
data.SetShowDataStrategy(new ShowPagedData(2, 1));
data.Show(); // 分頁:第 1 頁,每頁 2 筆
}
}
abstract class ShowDataStrategy // Strategy
{
public abstract void ShowData(IList data);
}
class ShowAllData : ShowDataStrategy // ConcreteStrategy
{
public override void ShowData(IList data)
{
for (int i = 0; i < data.Count; i++) Console.WriteLine(data[i]);
}
}
class ShowPagedData : ShowDataStrategy
{
private int _pageSize, _pageIndex;
public ShowPagedData(int pageSize, int pageIndex) { _pageSize = pageSize; _pageIndex = pageIndex; }
public override void ShowData(IList data)
{
for (int i = _pageSize * _pageIndex; i < _pageSize * (_pageIndex + 1); i++)
Console.WriteLine(data[i]);
}
}
class SearchData : ShowDataStrategy
{
private string _searchWord;
public SearchData(string searchWord) { _searchWord = searchWord; }
public override void ShowData(IList data)
{
for (int i = 0; i < data.Count; i++)
if (data[i].ToString().Contains(_searchWord))
Console.WriteLine(data[i]);
}
}
class Data // Context
{
private ShowDataStrategy _strategy;
private IList _data = new ArrayList();
public void SetShowDataStrategy(ShowDataStrategy strategy) => _strategy = strategy;
public void Show()
{
if (_strategy == null) _strategy = new ShowAllData();
Console.WriteLine(_strategy.GetType().ToString());
_strategy.ShowData(_data);
}
public void Add(string name) => _data.Add(name);
}
}
| 角色 | 類別 | 說明 |
|---|---|---|
| Strategy | ShowDataStrategy | 演算法共同介面 |
| ConcreteStrategy | ShowAllData, ShowPagedData, SearchData | 具體演算法實作 |
| Context | Data | 持有策略參考,委派執行 |
| Client | Program | 決定使用哪種策略 |