Unity3D设计模式之策略模式

发表于2018-07-12
评论0 1.7k浏览
当代码中的条件语句变多就会让整个代码部分变的臃肿,后期维护起来也比较麻烦,当策略模式的出现后可以比较好的解决这个问题。下面就让我们来了解下策略模式。

1.策略模式的定义

对策略模式的理解需要一些多态基础,将不同的算法分装起来,根据调用者的身份返回对应的算法算出的结果,让它们之前可以互相替换,此模式让算法的变化独立于使用算法的客户,将对象模型(Model)与对象的一些经常变动的行为(Behaviour)进行分离,将原有的“Is-A”(是一个类)模式改为“Has-A”(类包含类)模式。

2.策略模式的原理
其中会计代表算法 p 和 c 代表两个不同的对象 都调用这个算法 得到不同的结果

3.举例说明
  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();
    }
  }

4.优点

相对于普通的面向对象设计(Object - Oriented),大大提高代码的可重用性
可以在程序运行时,改变对象模型的行为。
通过将一系列算法分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。所有的算法都完成的是相同的工作,只是不同算法的实现方式不同,此模式可以让算法实用类以相同的方式调用不同的算法,降低了算法和算法实用类之间的耦合。
来自:https://blog.csdn.net/battletiger/article/details/77949668

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引