[设计]策略模式

来源:互联网 发布:win10家庭版优化教程 编辑:程序博客网 时间:2024/06/14 14:25

[设计]策略模式

场景

  • 雷达每次都有很多的通道,但是每个通道的数据和展示是不太一样的,这样就会形成很多的ifelse switch case 等。所以我们想能不能把所有的通道都封装成一个类呢。答案肯定是可以的。这样我们每次只要切换不能的通道调用不同的类就可以了。
    简单的也就是说各个通道的地位是平等的可以互换的。

解决办法

  • 我们定义一系列的类来表示各个通道。
  • 我们让调用者依赖于这个类的一个抽象父类。
  • 然后我们就可以实现这种操作了。
    1. 我们先创建一个执行调用对象
public class PassAlgorithm    {        IStrategyBase isb;        public PassAlgorithm(IStrategyBase ib)        {            isb = ib;        }        public void GetPassValue()        {            isb.CreateAlgorithm();        }    }
  1. 然后我们添加算有通道的基类
public interface IStrategyBase    {        void CreateAlgorithm();    }
  1. 我们实例化两个子类AB
public class BPassAlgorithm : IStrategyBase    {        public void CreateAlgorithm()        {            Console.WriteLine("B通道算法");        }    }    public class APassAlgorithm : IStrategyBase    {        public void CreateAlgorithm()        {            Console.WriteLine("A通道算法");        }    }
  1. 我们可以这样用
static void Main(string[] args)        {            IStrategyBase isb = new APassAlgorithm();            PassAlgorithm pa = new PassAlgorithm(isb);            pa.GetPassValue();            pa = new PassAlgorithm(new BPassAlgorithm());            pa.GetPassValue();            Console.Read();        }

注意

  1. 调用者必须知道所有的策略
  2. 通病,会有很多小类
  3. 要区分他和状态模式的区别,状态是自动改状态,这个是调用者初始化的时候进行更改
  4. 与工厂的区别,工厂创建与具体的使用无关你只要告诉工厂出什么就可以了工厂就会出,但是策略你可能很多选项你要自己定自己选。也不是你要一个算法对象时你可以找工厂创建,但是这个对象执行的时候你可以调用不同的策略。
    源码
    原文地址

所有的看不懂的问题都是一个个看得的懂的问题组合而成的。

原创粉丝点击