[英]Chain of responsibility pattern C++
我正在研究设计模式。 我不确定如何在C ++中实现责任链模式。 我正在使用Argo工具从图表生成代码 。
在此图中,Oracle类是“客户端”。 Oracle.cpp构造函数方法具有以下几行
#include "Oracle.h"
Oracle::Oracle(){
Validation v;//Here
}
在这里,我得到“错误:在此范围内未声明'Validation'”。 我的问题:是否有必要创建从Oracle到Validation的UML关系“依赖关系”? 或者我将如何解决该错误?
您的Oracle类不应具有Validation类型的成员,而应具有Handler类型的成员。
当然,这将在某个地方设置为“验证”(我认为这将是链的第一步)。
现在您仍然必须构建链,链的步骤应该不知道其他步骤。
现在有两个选择,要么允许Oracle类知道链将如何运行,要么可以自己构建链(带有所有依赖项)。 或者,您需要一个构建器类来构建链并将其注入到Oracle实例中(最好是通过构造器)。
第二种选择最好地遵循CoR模式的原理(链的用户不知道其内部工作)。
也许ArgoUML在验证中添加了该链接,以便能够创建Handler的实例,但这很奇怪。
此外,我相信setNext方法不属于Oracle类。 此类确实需要引用链中的第一个Handler对象,但这最好从构造函数中进行设置。 如果通过设置器设置,则应给它一个适当的名称,例如setHanlderChain,以使目的明确。
成功
回复评论:
责任链的一个元素不了解链本身,它只是一个参与者。 因此,您需要在某个地方创建链:实例化参与者并设置他们的下一步。
对于您来说,这可能看起来像这样(请注意,自从我用C ++编写任何重要文章以来已经有很长时间了,并且我认为类图中的顺序是执行的顺序)
Handler buildOracleChain()
{
CalculePR step6 = new CalculePR();
step1.setNext(null);
SolutionKE step5 = new SolutionKE();
step5.setNext(step6);
CalculeSP step4 = new ValcvuleSP();
step4.setNext(step5);
KeyGeneration step3 = new KeyGeneration();
step3.setNext(step4);
Encrypt step2 = new Encrypt();
step2.setNext(step3);
Validation step1 = new Validation();
step1.setNext(step2);
return step1;
}
对于第二个问题,我没有实际的示例,但是:如果将此方法放在构建器类(例如,OracleHandlerChainBuilder)中,则仅该类必须导入所有这些步骤,而oracle类则必须仅导入Handler。
在创建Oracle实例的地方,将其链(在本例中为setNext)设置为build方法的结果。 实例化Oracle类的类需要同时导入Oracle类和OracleHandlerChainBuilder类。
这样,可以最大程度地减少类之间的依赖关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.