2011-11-01 43 views
2

我鑽研C#而是跨越,我似乎無法解決的問題來了:C#,容器類的設計模式?

我設計了一個金融後臺測試和交易引擎和的那部分我想實現一個「策略容器」。這個策略容器應該有兩個目的。 (1)持有執行數學計算的不同策略的實例,並且(2)提供訪問器以便將新的刻度數據傳遞到策略實例中並接收來自策略實例的特定信息。

我上面提到的不同策略應該是獨特的類,然而,它們是從基類派生的。我想在這些策略中執行完全不同的操作,因此我認爲將它們設計爲獨立的類可以從一個基類派生出來。一個複雜因素是我需要包含在策略容器中的每個策略類的多個實例。每個戰略類別還包含一個股票代碼列表,每個代碼應該在戰略實例上獲得。

Strategy容器的另一個重要點是它可以創建,實例化以後也可以調用每個策略實例。

我要問一些你,你有什麼樣的想法如何,我能去設計和實施這樣的:

  • 什麼是最佳的整體設計模式?
  • 如所描述的,如果我爲每個策略創建不同的類,那麼我顯然最終會得到不同的類型,我如何將所有這些保存在Strategy Container中的一個容器/集合中?
  • 我該如何通過反射或其他方式創建,實例化和調用每個單一策略實例的方法,而無需知道我最終會得到多少個。我知道策略的名稱和類型,我知道股票代碼的名稱。
  • 我只是想提供哪些策略,我想掛鉤(我提供策略名稱=類名?),併爲每個策略的股票符號列表。 Strategy Container將爲列表所提供的策略類型的每個策略中的每個符號創建實例,並隨後調用「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() 
    { 

    } 
} 

回答

4

你應該仔細看看爲這種類型的系統使用接口。接口是您與策略的契約,您可以爲接口任意數量的不同實現。然後您的容器將包含接口。

喜歡的東西:

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

那麼你的實現將是這樣的:

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

的容器可以是:

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

讓我玩一點這些想法,我試驗後報告,感謝您的意見,真的很重視! –

+0

你可以通過upvoting的答案向你展示他的評論。我代表你做了。 – Jason

+0

似乎我還不能投票,剛剛加入今天...對不起 –

1

好,設計應該出現出需求分析/運算。我不會只是決定使用這種或那種模式,然後嘗試看看它是如何適合這個領域的。

從基類

再次,這必須由共同的功能,是由基類來實現被擔保獲得,否則,接口是你所需要的。策略模式由一個通用接口定義,其中所有策略都對一個共同的數據結構起作用。

所以我的建議是放棄任何關於設計的預判,並完全關注您的域的需求和建模。良好的設計纔會從此出現。

+0

公平點,以及採取。但是,鑑於我喜歡這件作品,你會如何去設計它?我想我已經詳細描述了所需的功能。如果您不相信,請糾正。 –

+0

似乎第一步是定義滴答數據,定義可以對其執行的計算和操作,並確定不同的計算算法。一旦你完成了所有的工作,應該很清楚組織接口,實現和繼承以產生所需結果的最佳方式。 – Jason

+0

所有這些都已完全實施和完成。如上所述,我所需要的是一種設計,它貫穿於不同的戰略類別中並進行迭代。 Tick數據保存在Tick結構中。內存數據庫提供一些策略可能需要訪問的時間序列。所有這一切都做得很好。我現在需要設計一個容納所有策略實例並可以調用它們的容器。 –