1. 定义
它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。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() |
4. 实例代码
// 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 |
该文章来自:http://www.dofactory.com/Patterns/PatternStrategy.aspx