Design Pattern-Strategy Pattern 设计模式之策略模式

Strategy Pattern

Ø  Definition

Ø  UML diagram

Ø  Participants

Ø  Sample code in C#

 

1.       Definition

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

2.       UML diagram

 

 

3.       Participants

    The classes and/or objects participating in this pattern are:

  • Strategy  (SortStrategy)
    • declares an interface common to all supported algorithms. Context uses this interface to call the algorithm defined by a ConcreteStrategy
  • ConcreteStrategy  (QuickSort, ShellSort, MergeSort)
    • implements the algorithm using the Strategy interface
  • Context  (SortedList)
    • is configured with a ConcreteStrategy object
    • maintains a reference to a Strategy object
    • may define an interface that lets Strategy access its data.

4.       Sample code in C #

This structural code demonstrates the Strategy pattern which encapsulates functionality in the form of an object. This allows clients to dynamically change algorithmic strategies.

// Strategy pattern -- Structural example

 

using System;

 

namespace DoFactory.GangOfFour.Strategy.Structural

{

  /// <summary>

  /// MainApp startup class for Structural

  /// Strategy Design Pattern.

  /// </summary>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void Main()

    {

      Context context;

 

      // Three contexts following different strategies

      context = new Context(new ConcreteStrategyA());

      context.ContextInterface();

 

      context = new Context(new ConcreteStrategyB());

      context.ContextInterface();

 

      context = new Context(new ConcreteStrategyC());

      context.ContextInterface();

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Strategy' abstract class

  /// </summary>

  abstract class Strategy

  {

    public abstract void AlgorithmInterface();

  }

 

  /// <summary>

  /// A 'ConcreteStrategy' class

  /// </summary>

  class ConcreteStrategyA : Strategy

  {

    public override void AlgorithmInterface()

    {

      Console.WriteLine(

        "Called ConcreteStrategyA.AlgorithmInterface()");

    }

  }

 

  /// <summary>

  /// A 'ConcreteStrategy' class

  /// </summary>

  class ConcreteStrategyB : Strategy

  {

    public override void AlgorithmInterface()

    {

      Console.WriteLine(

        "Called ConcreteStrategyB.AlgorithmInterface()");

    }

  }

 

  /// <summary>

  /// A 'ConcreteStrategy' class

  /// </summary>

  class ConcreteStrategyC : Strategy

  {

    public override void AlgorithmInterface()

    {

      Console.WriteLine(

        "Called ConcreteStrategyC.AlgorithmInterface()");

    }

  }

 

  /// <summary>

  /// The 'Context' class

  /// </summary>

  class Context

  {

    private Strategy _strategy;

 

    // Constructor

    public Context(Strategy strategy)

    {

      this._strategy = strategy;

    }

 

    public void ContextInterface()

    {

      _strategy.AlgorithmInterface();

    }

  }

}

Output

Called ConcreteStrategyA.AlgorithmInterface()
Called ConcreteStrategyB.AlgorithmInterface()
Called ConcreteStrategyC.AlgorithmInterface()

 


 

This real-world code demonstrates the Strategy pattern which encapsulates sorting algorithms in the form of sorting objects. This allows clients to dynamically change sorting strategies including Quicksort, Shellsort, and Mergesort.

Hide code

// 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>

  class MainApp

  {

    /// <summary>

    /// Entry point into console application.

    /// </summary>

    static void 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(new QuickSort());

      studentRecords.Sort();

 

      studentRecords.SetSortStrategy(new ShellSort());

      studentRecords.Sort();

 

      studentRecords.SetSortStrategy(new MergeSort());

      studentRecords.Sort();

 

      // Wait for user

      Console.ReadKey();

    }

  }

 

  /// <summary>

  /// The 'Strategy' abstract class

  /// </summary>

  abstract class SortStrategy

  {

    public abstract void Sort(List<string> list);

  }

 

  /// <summary>

  /// A 'ConcreteStrategy' class

  /// </summary>

  class QuickSort : SortStrategy

  {

    public override void Sort(List<string> list)

    {

      list.Sort(); // Default is Quicksort

      Console.WriteLine("QuickSorted list ");

    }

  }

 

  /// <summary>

  /// A 'ConcreteStrategy' class

  /// </summary>

  class ShellSort : SortStrategy

  {

    public override void Sort(List<string> list)

    {

      //list.ShellSort(); not-implemented

      Console.WriteLine("ShellSorted list ");

    }

  }

 

  /// <summary>

  /// A 'ConcreteStrategy' class

  /// </summary>

  class MergeSort : SortStrategy

  {

    public override void Sort(List<string> list)

    {

      //list.MergeSort(); not-implemented

      Console.WriteLine("MergeSorted list ");

    }

  }

 

  /// <summary>

  /// The 'Context' class

  /// </summary>

  class SortedList

  {

    private List<string> _list = new List<string>();

    private SortStrategy _sortstrategy;

 

    public void SetSortStrategy(SortStrategy sortstrategy)

    {

      this._sortstrategy = sortstrategy;

    }

 

    public void Add(string name)

    {

      _list.Add(name);

    }

 

    public void Sort()

    {

      _sortstrategy.Sort(_list);

 

      // Iterate over list and display results

      foreach (string name in _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

 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值