2012-02-06 76 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