策略模式随笔

  http://www.cnblogs.com/zhanghaipeng-Unity3D/p/4752734.html

  策略模式是通过将一系列算法分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。所有的算法都完成的是相同的工作,只是不同算法的实现方式不同,此模式可以让算法实用类以相同的方式调用不同的算法,降低了算法和算法实用类之间的耦合。

  假如一个人(客户端,算法使用类),现在比较饿(需要解决的问题),所以要吃东西(算法基类)来消除饿的感觉,同样是吃东西,我们可以吃米饭(算法类1),吃馒头(算法类2),吃肉(算法类3)等等,来达到让我们不饿的目的,UML图如下:

  代码实现如下:

  //如何解决饿

  public class Context
  {
    Strategy strategy;
    public Context(Strategy strategy) //初始化时传入策略
    {
      this.strategy = strategy;
    }

    public void ContextInterface() //策略使用接口
    {
      strategy.AlgorithmInterface();
    }
  }

  //算法基类

  public abstract class Strategy
  {
    public abstract void AlgorithmInterface();
  }

   //吃肉算法

  public class ConcreteStrategyC : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine("吃肉");
    }
  }

  

  //吃馒头算法

  public class ConcreteStrategyB : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine("吃馒头");
    }
  }

 

  //吃米饭算法

  public class ConcreteStrategyA : Strategy
  {
    public override void AlgorithmInterface()
    {
      Console.WriteLine("吃米饭");
    }
  }

 

  //客户端

  class Program
  {
    static void Main(string[] args)
    {

      Console.WriteLine("饿了...");
      Console.WriteLine("喜欢吃什么?");
      string likeFood = Console.ReadLine().Trim();
      Context context = null;
      switch(likeFood)
      {
        case "rice":
        context = new Context(new ConcreteStrategyA());
        break;
        case "bun":
        context = new Context(new ConcreteStrategyB());
        break;
        case "meat":
        context = new Context(new ConcreteStrategyC());
        break;
       }
      if (null != context)
      context.ContextInterface();

    }
  }

  正如我们所看到的,当需要增加新的算法时,仍然需要修改原有代码。

    

posted @ 2015-08-23 16:39  特--呆  阅读(501)  评论(0编辑  收藏  举报