zoukankan      html  css  js  c++  java
  • 策略模式随笔

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

        }
      }

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

        

  • 相关阅读:
    系列5:序列化与反序列化
    山塞一个PetShop ——源代码下载、安装、配置及体验
    以类为单位的编程思想
    山塞一个PetShop 4.0(01)——最简单的数据库连接
    ASP.NET知识点(二):数据访问层的基础[SQLHelper]
    表格布局规范
    ASP.NET知识点(一):面向接口,工厂模式的程序结构
    ASP.NET的主题
    阅读器关闭时 FieldCount 的尝试无效
    出错信息
  • 原文地址:https://www.cnblogs.com/zhanghaipeng-Unity3D/p/4752734.html
Copyright © 2011-2022 走看看