繁体   English   中英

责任链模式C ++

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM