C#,容器类设计模式?

Mat*_*olf 2 c# reflection containers class base

我钻研了C#,但遇到了一个我似乎无法解决的问题:

我设计了一个财务回溯测试和交易引擎,作为其中的一部分,我想实现一个"策略容器".此策略容器应有两个用途.(1)保存执行数学计算的不同策略的实例,以及(2)提供访问器以便将新的tick数据传递到策略实例并从策略实例接收某些信息.

我上面提到的不同策略应该是唯一的类,但是它们来自基类.我想在这些策略中执行完全不同的操作,因此我认为将它们设计为从一个基类派生的单独类是可行的.一个复杂因素是我需要策略容器中包含的每个策略类的多个实例.每个策略类还包含一个股票代码列表,每个符号应该在策略实例上获得.

Strategy容器的另一个重点是它可以创建,实例化,然后还可以调用每个策略实例.

我想问一下你们有什么样的想法我可以如何设计和实现这个:

  • 什么是整体最佳设计模式?
  • 如上所述,如果我为每个策略创建不同的类,那么我显然最终会得到不同的类型,我怎么能在策略容器中的一个容器/集合中保存所有这些?
  • 我怎样才能通过反射或其他方式创建,实例化和调用每个单一策略实例的方法,而不知道我最终会得到多少.我知道策略的名称和类型,我知道股票代码的名称.
  • 我只想提供我想要连接的策略(我提供策略名称=类名?),并为每个策略提供股票代码列表.策略容器将为列表所提供的策略类型的每个策略中的每个符号创建实例,并随后调用"RunStrategy(引用引用)"方法,该方法将新引号提供给每个实例,以便可以执行计算.
  • 一个目标是保持每个策略类的接口尽可能干净,大多数标准(重复)功能在derived-from基类中实现.

我不是要求完整的源代码,而是为了想法你认为我应该如何设计这个东西,以及我如何能够完成上述每一点.这对我自己来说并不会变成任何商业产品.我很乐意编写实现数学比特的代码,但我对设计模式和系统架构不太熟悉.

编辑:Graymatter,我玩了一下,似乎你提供了我正在寻找的东西.非常感谢.

class Program
{
    static void Main(string[] args)
    {
        List<IStrategy> container = new List<IStrategy>();

        container.Add(new StrategyOne());

        container[0].AddValue(50);

        Console.ReadLine();
    }




}

public interface IStrategy
{
    void AddValue(int value);  
}


public class StrategyOne : StrategyBase
{
    public override void Calculates()
    {
        Console.WriteLine("This is my value: " + myValue);
    }

}

public class StrategyBase : IStrategy
{
    protected int myValue;

    public void AddValue(int value)
    {
        Console.WriteLine("Run Strategy in Base");

        myValue = value;

        Calculates();
    }

    public virtual void Calculates()
    {

    }  
}
Run Code Online (Sandbox Code Playgroud)

Gra*_*ter 5

您应该真正考虑使用此类系统的接口.界面是您与策略的契约,您可以为界面提供任意数量的不同实现.然后,您的容器将包含接口.

就像是:

public interface IStrategy
{
  void RunStrategy(Quote quote);
}
Run Code Online (Sandbox Code Playgroud)

然后你的实现将是这样的:

public class StrategyOne : IStrategy
{
  void RunStrategy(Quote quote)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

容器可以是:

List<IStrategy> container = new List<IStrategy>();
Run Code Online (Sandbox Code Playgroud)