我正在学习设计模式。我不确定如何在C++中实现责任链模式。我正在使用Argo工具从我的图表生成代码

。
在此图中,Oracle类是一个“客户端”。Oracle.cpp构造函数方法包含以下几行
#include "Oracle.h"
Oracle::Oracle(){
Validation v;//Here
}在这里我得到了“错误:‘验证’没有在这个作用域中声明”。我的问题:是否有必要创建一个从Oracle到Validation的UML关系“依赖”?或者,我如何能够修复此错误?
发布于 2013-02-14 18:38:08
您的Oracle类不应具有验证类型的成员,而应具有类型为Handler的成员。
当然,这将被设置为某个地方的验证(我假设这将是链的第一步)。
现在你仍然要构建链,链的步骤不应该知道其他步骤。
现在有两种选择,一种是允许Oracle类知道链将如何操作,另一种是自己构建链(以及由此产生的所有依赖项)。或者,您需要一个构建器类来构建链并将其注入到Oracle实例中(最好是通过构造函数)。
第二种选择最好地遵循CoR模式的原理(链的用户不知道它的内部工作)。
也许ArgoUML将该链接添加到验证中是为了能够创建处理程序的实例,但这很奇怪。
此外,我认为setNext方法不属于Oracle类。这个类确实需要一个对链的第一个Handler对象的引用,但最好从构造函数中设置。如果通过setter设置,您应该给它一个适当的名称,如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类必须只导入处理程序。
在创建Oracle实例的位置,将其链(在本例中为setNext )设置为build方法的结果。将实例化Oracle类的类需要同时导入Oracle类和OracleHandlerChainBuilder类。
这样,类之间的依赖关系就最小化了。
https://stackoverflow.com/questions/14866853
复制相似问题