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

C# 設計模式實戰:Strategy 策略模式完整解析(一)

     編輯:關於C語言

模式意圖

定義一系列演算法,分別封裝並使其可互換,讓演算法可獨立於使用它的 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);
    }
}

角色對應表

角色類別說明
StrategyShowDataStrategy演算法共同介面
ConcreteStrategyShowAllData, ShowPagedData, SearchData具體演算法實作
ContextData持有策略參考,委派執行
ClientProgram決定使用哪種策略
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved