程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 無廢話C#設計模式之十五:Strategy(1)

無廢話C#設計模式之十五:Strategy(1)

編輯:關於C語言

意圖

定義一系列的算法,把它們一個一個封裝起來,並且使它們可相互替換。本模式使得算法可以獨立於它的客戶而變化。

場景

在開發程序的時候,我們經常會根據環境不同采取不同的算法對對象進行處理。比如,在一個新聞列表頁面需要顯示所有新聞,而在一個新聞搜索頁面需要根據搜索關鍵詞顯示匹配的新聞。如果在新聞類內部有一個ShowData方法的話,那麼我們可能會傳入一個searchWord的參數,並且在方法內判斷如果參數為空則顯示所有新聞,如果參數不為空則進行搜索。如果還有分頁的需求,那麼還可能在方法內判斷是否分頁等等。

這樣做有幾個不好的地方,一是ShowData方法太復雜了,代碼不容易維護並且可能會降低性能,二是如果還有其它需求的話勢必就需要修改ShowData方法,三是不利於重用一些算法的共同部分。由此引入策略模式,把算法進行封裝,使之可以靈活擴展和替換。

示例代碼

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

    {

        abstract public 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

    {

        private int pageSize;

        private int 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

    {

        private string searchWord;

        public string SearchWord

        {

            get { return searchWord; }

            set { searchWord = value; }

        }

        public SearchData(string searchWord)

        {

            this.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

    {

        private ShowDataStrategy strategy;

        private 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().ToString());

            strategy.ShowData(data);

        }

        public void Add(string name)

        {

            data.Add(name);

        }

    }

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved