策略模式,为什么需要额外的类来管理策略类

时间:2018-09-04 09:44:33

标签: c++ design-patterns

我正在学习策略模式,不知道Class上下文的目的是什么?

似乎使这些代码变得更加复杂,谢谢您的帮助。

class Strategy
{
public:
    virtual void excute();
};
class S1 : public Strategy
{
public:
    virtual void excute() 
    {
        //*******s1
    }
};

class S2 : public Strategy
{
public:
    virtual void excute()
    {
        //*******s2
    }
};

class Context 
{
private:
    Strategy* s;
public:
    Context(Strategy *s)
    {
        this->s = s;
    }
    void executeStrategy() 
    {
        s->excute();
    }
};

int main()
{
    //******classic style, (pls ignore memory issue)****************************
    Context* c= new Context(new S1());
    c->executeStrategy();

    c =new Context(new S2());
    c->executeStrategy();


    //*****why does it need a extra class Context ,rather than use the follwing code********************
    Strategy* s = new S1();
    s->excute();

    s = new S2();
    s->excute();
    //************************
}

2 个答案:

答案 0 :(得分:1)

上下文是执行该策略所需的任何模块的占位符。

在正常情况下,您将需要某些组件(例如购买)(例如收费客户)。组件是上下文,而动作是策略(可以是处理信用卡支付的一类,也可以是处理贝宝支付的另一种)。

策略类不存储自己的数据,它们使用上下文的数据(在我们的情况下为购买和客户数据)。

这与将付款方式硬编码到购买类中相反。

希望这使它更清晰。

答案 1 :(得分:1)

该策略模式允许在运行时更改算法。

您的Strategy类实现不同的算法。它们不包含任何其他数据,也不包含任何其他方法,它们只是算法的容器。

您的Context类通过使用Strategy实例使用一种算法。

在您的示例中,所有类都剥离到最低限度,是的,在这种情况下,Context类看起来像是不必要的包装器。但您一定不要忘记,Context类应该是具有成员,状态等的正确类,而Strategy类应该只是{{ 1}}类可以使用。

您的示例仅显示了模式的体系结构。这是供您学习和理解如何实现该模式的。在现实生活中,这并不是一个完全有意义的业务实现。

如果您摆脱了Context类,那么您就不再有策略模式,您只需拥有多个可以完成不同任务的类即可。