首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 設計模式無廢話系列(十五):Strategy 策略模式

     編輯:關於C#

意圖

定義一系列算法,封裝並使其可互換,讓算法能獨立於使用它的客戶而變化。

適用場景

新聞列表頁:無關鍵字顯示全部、有關鍵字搜尋、分頁顯示。若在 News.ShowData 中用參數與條件判斷,導致方法膨脹、難維護、違反開閉原則。引入 Strategy 封裝算法,靈活擴展替換。

完整範例程式碼

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();
            data.SetShowDataStrategy(new ShowPagedData(2, 1));
            data.Show();
        }
    }

    abstract class ShowDataStrategy
    {
        public abstract void ShowData(IList data);
    }
    class ShowAllData : ShowDataStrategy
    {
        public override void ShowData(IList data)
        {
            for (int i = 0; i < data.Count; i++) Console.WriteLine(data[i]);
        }
    }
    class ShowPagedData : ShowDataStrategy
    {
        int pageSize, pageIndex;
        public ShowPagedData(int pageSize, int pageIndex) { this.pageSize = pageSize; this.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
    {
        public string SearchWord { get; set; }
        public SearchData(string word) { SearchWord = word; }
        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
    {
        ShowDataStrategy strategy;
        IList data = new ArrayList();
        public void SetShowDataStrategy(ShowDataStrategy strategy) => this.strategy = strategy;
        public void Show()
        {
            if (strategy == null) strategy = new ShowAllData();
            Console.WriteLine(strategy.GetType());
            strategy.ShowData(data);
        }
        public void Add(string name) => data.Add(name);
    }
}

程式碼執行結果

Strategy 模式執行結果

程式碼解析

  • Data:Context(環境/上下文),持有 Strategy 參考,提供 SetShowDataStrategy 切換策略。
  • ShowDataStrategy:抽象策略,定義統一介面。
  • ShowAllData/ShowPagedData/SearchData:具體策略,實作真實算法。
  • 客戶端調用時決定使用何種策略。
  • 環境角色複雜度大幅降低;新增顯示方式只需新增具體策略類(實作抽象介面),環境類零修改。可復用邏輯可下沉至抽象策略類。

何時採用

  • 代碼角度:類別有多行為,內部以條件判斷實現 → 封裝為策略類。
  • 應用角度:系統需從多算法選一,並透過統一介面獲取輸出。

實作要點

  • Context 持有 Strategy 實例。
  • Strategy 需用 Context 數據時:Context 傳遞數據給所有策略(通訊開銷)或傳遞自身給策略(緊密耦合),視需求取捨。
  • 客戶端未提供策略時,Context 可提供預設策略。

注意事項

  • 客戶端需了解具體策略,僅當客戶端能做選擇時適用。
  • 策略對象過多可考慮 Flyweight 化,額外狀態由 Context 管理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved