Chinaunix首页 | 论坛 | 博客
  • 博客访问: 657862
  • 博文数量: 220
  • 博客积分: 10487
  • 博客等级: 上将
  • 技术积分: 2072
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-09 00:25
文章分类

全部博文(220)

文章存档

2012年(5)

2011年(38)

2010年(135)

2009年(42)

我的朋友

分类:

2009-10-23 00:06:59

定义

定义一组算法,并封装使其能相互切换。策略模式使得算法因客户使用不同而改变。

使用频度: 中高

UML 类图




参与者

该模式参与的类或对象

  • Strategy(策略)
    • 定义所有算法支持的公共接口,Context会使用该接口调用ConcreteStategy定义的算法.
  • ConcreteStrategy(具体策略,如快排,希尔排序,插入排序)
    • 实现Stategy接口的算法
  • Context(环境,如SortedList)
    • 配置了一个ConcreteStrategy对象
    • 维护ConcreteStrategy对象的引用
    • 可能定义了让Strategy访问其数据的接口


C# 示例代码




// Strategy pattern -- Structural example


using System;

 

namespace DoFactory.GangOfFour.Strategy.Structural

{

  ///




  /// MainApp startup class for Structural


  /// Strategy Design Pattern.


  ///



  class MainApp

  {

    ///


    /// Entry point into console application.


    ///



    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();

    }

  }

 

  ///


  /// The 'Strategy' abstract class


  ///



  abstract class Strategy

  {

    public abstract void AlgorithmInterface();

  }

 

  ///


  /// A 'ConcreteStrategy' class


  ///



  class ConcreteStrategyA : Strategy

  {

    public override void AlgorithmInterface()

    {

      Console.WriteLine(

        "Called ConcreteStrategyA.AlgorithmInterface()");

    }

  }

 

  ///


  /// A 'ConcreteStrategy' class


  ///



  class ConcreteStrategyB : Strategy

  {

    public override void AlgorithmInterface()

    {

      Console.WriteLine(

        "Called ConcreteStrategyB.AlgorithmInterface()");

    }

  }

 

  ///


  /// A 'ConcreteStrategy' class


  ///



  class ConcreteStrategyC : Strategy

  {

    public override void AlgorithmInterface()

    {

      Console.WriteLine(

        "Called ConcreteStrategyC.AlgorithmInterface()");

    }

  }

 

  ///


  /// The 'Context' class


  ///



  class Context

  {

    private Strategy _strategy;

 

    // Constructor


    public Context(Strategy strategy)

    {

      this._strategy = strategy;

    }

 

    public void ContextInterface()

    {

      _strategy.AlgorithmInterface();

    }

  }

}


输出:

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


阅读(1377) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~