我正在学习策略模式,不知道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();
//************************
}
答案 0 :(得分:1)
上下文是执行该策略所需的任何模块的占位符。
在正常情况下,您将需要某些组件(例如购买)(例如收费客户)。组件是上下文,而动作是策略(可以是处理信用卡支付的一类,也可以是处理贝宝支付的另一种)。
策略类不存储自己的数据,它们使用上下文的数据(在我们的情况下为购买和客户数据)。
这与将付款方式硬编码到购买类中相反。
希望这使它更清晰。
答案 1 :(得分:1)
该策略模式允许在运行时更改算法。
您的Strategy
类实现不同的算法。它们不包含任何其他数据,也不包含任何其他方法,它们只是算法的容器。
您的Context
类通过使用Strategy
实例使用一种算法。
在您的示例中,所有类都剥离到最低限度,是的,在这种情况下,Context
类看起来像是不必要的包装器。但您一定不要忘记,Context
类应该是具有成员,状态等的正确类,而Strategy
类应该只是{{ 1}}类可以使用。
您的示例仅显示了模式的体系结构。这是供您学习和理解如何实现该模式的。在现实生活中,这并不是一个完全有意义的业务实现。
如果您摆脱了Context
类,那么您就不再有策略模式,您只需拥有多个可以完成不同任务的类即可。