C#,容器类设计模式?

C#,容器类设计模式?,c#,class,reflection,containers,base,C#,Class,Reflection,Containers,Base,我钻研了C#,但遇到了一个我似乎无法解决的问题: 我设计了一个财务回溯测试和交易引擎,作为其中的一部分,我喜欢实现一个“策略容器”。这个策略容器应该有两个目的。(1) 保留执行数学计算的不同策略的实例,(2)提供访问器,以便将新的勾号数据传递到策略实例,并从策略实例接收某些信息 我上面提到的不同策略应该是从基类派生的唯一类。我希望在这些策略中执行完全不同的操作,因此我认为将它们设计为从一个基类派生的独立类是可行的。一个复杂的问题是,我需要策略容器中包含的每个策略类的多个实例。每个strategy

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

我设计了一个财务回溯测试和交易引擎,作为其中的一部分,我喜欢实现一个“策略容器”。这个策略容器应该有两个目的。(1) 保留执行数学计算的不同策略的实例,(2)提供访问器,以便将新的勾号数据传递到策略实例,并从策略实例接收某些信息

我上面提到的不同策略应该是从基类派生的唯一类。我希望在这些策略中执行完全不同的操作,因此我认为将它们设计为从一个基类派生的独立类是可行的。一个复杂的问题是,我需要策略容器中包含的每个策略类的多个实例。每个strategy类还包含一个股票符号列表,每个符号都应该获得其策略实例

Strategy容器的另一个要点是,它可以创建、实例化每个策略实例,并在以后调用它们

我想问你们中的一些人,你们有什么样的想法,我如何着手设计和实施:

  • 总体上最好的设计模式是什么
  • 如前所述,如果我为每个策略创建不同的类,那么我显然也会得到不同的类型,我如何在策略容器中的一个容器/集合中保存所有这些类型
  • 如何通过反射或其他方式创建、实例化和调用每个策略实例的方法,而不知道最终会有多少方法。我知道策略的名称和类型,我知道股票符号的名称
  • 我只想提供我想要连接的策略(我提供策略名称=类名?)以及每个策略的股票符号列表。策略容器将为提供列表的策略类型的每个策略中的每个符号创建实例,并随后调用“RunStrategy(Quote Quote)”方法,该方法将新的引号输入到每个实例中,以便可以执行计算
  • 一个目标是保持每个策略类的接口尽可能干净,大多数标准(重复)功能都在派生自基类中实现
我不是要完整的源代码,而是想知道你们认为我应该如何设计这个东西,以及我如何完成上面的每一点。这是我自己的东西,不会变成任何商业产品。我对编写实现数学部分的代码非常熟悉,但对设计模式和系统架构不太熟悉

编辑: 格雷马特,我玩了一会儿,似乎你提供了我想要的东西。非常感谢

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

    }  
}
类程序
{
静态void Main(字符串[]参数)
{
列表容器=新列表();
container.Add(newstrategyone());
容器[0]。AddValue(50);
Console.ReadLine();
}
}
公共接口策略
{
无效附加值(int值);
}
公共类策略一:策略库
{
公共覆盖无效计算()
{
Console.WriteLine(“这是我的值:+myValue”);
}
}
公共类战略库:IST战略
{
受保护的int-myValue;
公共void AddValue(int值)
{
Console.WriteLine(“在基础中运行策略”);
我的价值=价值;
计算();
}
公共虚拟空间计算()
{
}  
}

您应该真正了解如何为这种类型的系统使用接口。接口是您与策略的契约,您可以为接口执行任意数量的不同实现。然后,容器将包含接口

比如:

public interface IStrategy
{
  void RunStrategy(Quote quote);
}
那么您的实现将是这样的:

public class StrategyOne : IStrategy
{
  void RunStrategy(Quote quote)
  {
  }
}
容器可以是:

List<IStrategy> container = new List<IStrategy>();
列表容器=新列表();

好吧,设计应该在需求分析/分析中出现。我不会只是决定使用这个或那个模式,然后尝试看看它如何适合这个领域

从基类派生

同样,这必须由基类完成的公共功能来保证,否则,您只需要一个接口。策略模式由一个公共接口定义,其中所有策略都作用于一个公共数据结构


因此,我的建议是放弃对设计的任何预先判断,充分关注领域的需求和建模。好的设计将从中脱颖而出。

让我来玩玩一下这些想法,我在试验后报告,感谢您的投入,真的很有价值!!!你可以通过对答案投赞成票来表明你重视他的评论。我是代表你做的,说得对,很好。然而,考虑到我希望这件作品能完成什么,你会如何着手设计它呢?我想我已经非常详细地描述了所需的功能。如果您不这么认为,请更正。似乎第一步是定义勾号数据,定义可以对其执行的计算和操作,并确定不同的计算算法。一旦您完成了所有这些,就应该非常清楚组织接口、实现和继承以产生所需结果的最佳方式。所有这些都已完全实现并完成。如前所述,我需要的是一个能够保存并迭代不同策略类的设计。勾号数据保存在勾号结构中。内存数据库提供一些策略可能需要访问的时间序列。所有这些都完成了,并且效果良好。我现在需要设计一个容器来保存所有的策略实例并可以调用它们。@Matt这是一个很难回答的问题-需求不清楚。也许如果你总结一下这个问题或者哈