策略模式(Strategy)
2012-08-10 09:56
246 查看
1. 定义
它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
2. UML 类图
3. 结构代码
4. 实例代码
该文章来自:http://www.dofactory.com/Patterns/PatternStrategy.aspx
它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
2. UML 类图
3. 结构代码
// Strategy pattern -- Structural example |
using System; namespace DoFactory.GangOfFour.Strategy.Structural { ///<summary> /// MainApp startup class for Structural /// Strategy Design Pattern. ///</summary> classMainApp { ///<summary> /// Entry point into console application. ///</summary> staticvoid Main() { Context context; // Three contexts following different strategies context = new Context(newConcreteStrategyA()); context.ContextInterface(); context = new Context(newConcreteStrategyB()); context.ContextInterface(); context = new Context(newConcreteStrategyC()); context.ContextInterface(); // Wait for user Console.ReadKey(); } } ///<summary> /// The 'Strategy' abstract class ///</summary> abstractclass Strategy { publicabstract void AlgorithmInterface(); } ///<summary> /// A 'ConcreteStrategy' class ///</summary> classConcreteStrategyA : Strategy { publicoverride void AlgorithmInterface() { Console.WriteLine( "Called ConcreteStrategyA.AlgorithmInterface()"); } } ///<summary> /// A 'ConcreteStrategy' class ///</summary> classConcreteStrategyB : Strategy { publicoverride void AlgorithmInterface() { Console.WriteLine( "Called ConcreteStrategyB.AlgorithmInterface()"); } } ///<summary> /// A 'ConcreteStrategy' class ///</summary> classConcreteStrategyC : Strategy { publicoverride void AlgorithmInterface() { Console.WriteLine( "Called ConcreteStrategyC.AlgorithmInterface()"); } } ///<summary> /// The 'Context' class ///</summary> classContext { privateStrategy _strategy; // Constructor public Context(Strategy strategy) { this._strategy = strategy; } publicvoid ContextInterface() { _strategy.AlgorithmInterface(); } } } |
Output Called ConcreteStrategyA.AlgorithmInterface() Called ConcreteStrategyB.AlgorithmInterface() Called ConcreteStrategyC.AlgorithmInterface() |
// Strategy pattern -- Real World example |
using System; using System.Collections.Generic; namespace DoFactory.GangOfFour.Strategy.RealWorld { ///<summary> /// MainApp startup class for Real-World /// Strategy Design Pattern. ///</summary> classMainApp { ///<summary> /// Entry point into console application. ///</summary> staticvoid Main() { // Two contexts following different strategies SortedList studentRecords =new SortedList(); studentRecords.Add("Samual"); studentRecords.Add("Jimmy"); studentRecords.Add("Sandra"); studentRecords.Add("Vivek"); studentRecords.Add("Anna"); studentRecords.SetSortStrategy(newQuickSort()); studentRecords.Sort(); studentRecords.SetSortStrategy(newShellSort()); studentRecords.Sort(); studentRecords.SetSortStrategy(newMergeSort()); studentRecords.Sort(); // Wait for user Console.ReadKey(); } } ///<summary> /// The 'Strategy' abstract class ///</summary> abstractclass SortStrategy { publicabstract void Sort(List<string> list); } ///<summary> /// A 'ConcreteStrategy' class ///</summary> classQuickSort : SortStrategy { publicoverride void Sort(List<string> list) { list.Sort(); // Default is Quicksort Console.WriteLine("QuickSorted list "); } } ///<summary> /// A 'ConcreteStrategy' class ///</summary> classShellSort : SortStrategy { publicoverride void Sort(List<string> list) { //list.ShellSort(); not-implemented Console.WriteLine("ShellSorted list "); } } ///<summary> /// A 'ConcreteStrategy' class ///</summary> classMergeSort : SortStrategy { publicoverride void Sort(List<string> list) { //list.MergeSort(); not-implemented Console.WriteLine("MergeSorted list "); } } ///<summary> /// The 'Context' class ///</summary> classSortedList { privateList<string> _list =new List<string>(); privateSortStrategy _sortstrategy; publicvoid SetSortStrategy(SortStrategy sortstrategy) { this._sortstrategy = sortstrategy; } publicvoid Add(string name) { _list.Add(name); } publicvoid Sort() { _sortstrategy.Sort(_list); // Iterate over list and display results foreach (string namein _list) { Console.WriteLine(" " + name); } Console.WriteLine(); } } } |
Output QuickSorted list Anna Jimmy Samual Sandra Vivek ShellSorted list Anna Jimmy Samual Sandra Vivek MergeSorted list Anna Jimmy Samual Sandra Vivek |
相关文章推荐
- 策略模式(strategy)
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略模式设计模式(Strategy)摘录
- 策略模式(Strategy Pattern)
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略模式Strategy(对象行为型)
- 策略模式(Strategy)
- 策略模式 Strategy -- 学习HeadFirst设计模式记录
- 策略模式Strategy
- 策略模式(strategy)
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略模式(Strategy)和委托(Delegate)的比较
- 策略模式--Strategy
- 策略模式(Strategy)
- 策略模式 Strategy (行为型)