策略模式随笔

      http://blog.csdn.net/littleadr

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

  假如一个人(客户端,算法使用类),现在比较饿(需要解决的问题),所以要吃东西(算法基类)来消除饿的感觉,同样是吃东西,我们可以吃米饭(算法类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();

    }
  }

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

    

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值