【问题标题】:C#, container class design pattern?C#,容器类设计模式?
【发布时间】:2011-12-19 14:44:14
【问题描述】:

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

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

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

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

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

  • 总体上最好的设计模式是什么?
  • 如前所述,如果我为每个策略创建不同的类,那么我显然也会得到不同的类型,我如何将所有这些都保存在策略容器内的一个容器/集合中?
  • 如何通过反射或其他方式创建、实例化和调用每个策略实例的方法,而不知道我最终会得到多少。我知道策略的名称和类型,也知道股票代码的名称。
  • 我只想提供我想连接的策略(我提供策略名称 = 类名称?),并为每个策略提供一个股票代码列表。策略容器将为提供列表的策略类型的每个策略中的每个交易品种创建实例,并随后调用“RunStrategy(Quote quote)”方法,该方法将新报价输入每个实例,以便可以执行计算。
  • 一个目标是使每个策略类的接口尽可能干净,大多数标准(重复)功能都在派生的基类中实现。

我不要求提供完整的源代码,而是提供您认为我应该如何设计这个东西以及我如何完成上述每一点的想法。这是我自己的东西,不会变成任何商业产品。我对编写实现数学点点滴滴的代码非常满意,但我对设计模式和系统架构不太熟悉。

编辑: 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()
    {

    }  
}

【问题讨论】:

    标签: c# class reflection containers base


    【解决方案1】:

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

    类似:

    public interface IStrategy
    {
      void RunStrategy(Quote quote);
    }
    

    那么你的实现会是这样的:

    public class StrategyOne : IStrategy
    {
      void RunStrategy(Quote quote)
      {
      }
    }
    

    容器可以是:

    List<IStrategy> container = new List<IStrategy>();
    

    【讨论】:

    • 让我玩一下这些想法,我实验后反馈,感谢您的意见,非常重视!!!
    • 您可以通过支持答案来表明您重视他的评论。我代表你做了。
    【解决方案2】:

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

    从基类派生

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

    所以我的建议是放弃对设计的任何预先判断,并完全专注于您的领域的需求和建模。好的设计将由此产生。

    【讨论】:

    • 公平点,很好。但是,鉴于我喜欢这件作品来完成你将如何设计它?我想我已经非常详细地描述了所需的功能。如果您不相信,请更正。
    • 似乎第一步是定义tick数据,定义可以对其执行的计算和操作,并识别不同的计算算法。一旦你完成了所有这些,应该很清楚组织接口、实现和继承以产生所需结果的最佳方法。
    • 所有这些都已完全实施和完成。如前所述,我需要的是一种能够保持并迭代不同策略类的设计。 Tick 数据保存在 Tick 结构中。内存数据库提供了一些策略可能需要访问的时间序列。所有这些都已完成并且运行良好。我现在需要设计一个包含所有策略实例并可以调用它们的容器。
    • @Matt 这超出了一个 SO 问题 - 要求不明确。也许如果您总结了这个问题或有其他问题可以回答。我的回答可能不是一个答案,只是一些友好的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2017-11-23
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多