策略模式(Strategy)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值