2012-02-06 74 views
1

在我的理解中,戰略模式被用來使行爲可以互換。這涉及到策略的責任是在接口中定義的,客戶可以將其委託給接口。例如。假設可以通過不同的方式獲得值,那麼接口將有一個方法「getValue()」。逆向控制流程的策略模式是什麼?

我的問題涉及其中控制流是相反的情況。例如,如果具體策略在客戶端啓動請求「onValueChanged()」(假設它具有對客戶端或回調接口的引用)。

這仍然被認爲是一種戰略模式?

更新 - 增加了下面的源代碼示例:

interface DataSupplierCb 
{ 
    void onValueChanged(int a); 
} 

interface DataSupplier 
{ 
    void check(); 
} 

// NOTE 1: Data supplier knows how the get the value 
class ConcreteDataSupplier : public DataSupplier 
{ 
    void check() 
    {   
    myDataSupplierCb.onValueChanged(47); 
    } 
} 

class Client : public DataSupplierCb 
{ 
    void onValueChanged(int a) 
    { 
    // NOTE 2: Client knows what to do with the value 
    } 

    void changeDataSupplier(int i) 
    { 
    if (i == 1) 
    { 
     myCurrentDataSupplier = new ConcreteDataSupplier(this); 
    } 
    } 
} 
+0

對我來說,它看起來像'observer' – sll 2012-02-06 16:58:39

+0

如果你的代碼放了一點點的代碼作爲例子,那麼它可能會有所幫助。甚至不必是真實的代碼,僞代碼就足夠了。 – tcarvin 2012-02-07 13:09:47

+0

感謝您的回覆。我試圖製作一個說明我的案例的源代碼示例。 – Vandhunden 2012-02-07 13:54:16

回答

1

如果DataSupplier接口的意圖,讓您的Client交換的,並且委託給不同的具體數據取的實現則是可以考慮的策略。您的Client與用於在使用策略模式時預期獲取值的細節(又名策略)隔離。而且該Client引用傳遞到戰略的事實是好的,共同:

(從四人幫)

「戰略與上下文交互,從而實現所選擇的算法中的 上下文可以通過所有數據當算法被調用時,該算法需要策略 或者,上下文可以將 本身作爲參數傳遞給策略操作,從而允許策略 根據需要回調

您的上下文是Client

現在,一切都這樣說,難得的是,僅使用一個模式的解決方案。您的通知似乎使用觀察者模式作爲另一張海報評論,這很好。

我不喜歡你,雖然實施的哪些是你的戰略是一個純粹的接口。並不總是一件壞事,但在這個的情況下,使用該通知回調,接口不提供通知回調將發生的保證。接口只保證方法簽名。我建議在基類中使用模板模式來從中驅除策略。

abstract class DataSupplier 
{ 

    protected ClientInterface _client; 

    // ctor takes in context 
    public DataSupplier(ClientInterface client) 
    { 
     _client - client; 
    } 

    public void check() 
    { 
     int priorValue = 46; 

     int newValue = OnGetValue(); 

     if (priorValue != newValue) 
     _client.onValueChanged(newValue) 

    } 

    protected abstract int OnCheck(); 

} 

然後:

class ConcreteDataSupplier : DataSupplier 
{ 

    // Check, and notification, are handled by the base. We only need 
    // to implement the actually data fetching 

    int OnGetValue() 
    {   
     return someValue; 
    } 
} 

通過這種方法,我知道的通知將被處理。我不需要擔心一個實現者在稍後的新策略中遺忘它。

+0

很好的回答和建議。我同意這可以被看作是不同模式的組合。 – Vandhunden 2012-02-08 18:01:10

2

號這將不會是策略模式。在戰略模式中,戰略界面和具體戰略實施並不瞭解客戶。

客戶知道的策略接口,並一無所知實際的實現。

這種模式的目的是替換爲另一個策略,而不需要修改客戶端的能力。策略通常是某種算法。

你所描述似乎更加接近,其中有一個主題,一個或幾個觀察家實現一個共同的接口(或從一個公共基類繼承)的Observer設計模式。主體是觀察對象,觀察者是每當主體改變時需要通知的對象。例如:主體可以是某種數據源,一個觀察者可以是直方圖視圖,另一個觀察者可以是餅圖視圖。

http://en.wikipedia.org/wiki/Observer_pattern 
http://en.wikipedia.org/wiki/Strategy_pattern