首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >责任链模式C++

责任链模式C++
EN

Stack Overflow用户
提问于 2013-02-14 10:26:03
回答 1查看 1.6K关注 0票数 0

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

在此图中,Oracle类是一个“客户端”。Oracle.cpp构造函数方法包含以下几行

代码语言:javascript
运行
复制
#include "Oracle.h"
Oracle::Oracle(){
    Validation v;//Here
}

在这里我得到了“错误:‘验证’没有在这个作用域中声明”。我的问题:是否有必要创建一个从Oracle到Validation的UML关系“依赖”?或者,我如何能够修复此错误?

EN

回答 1

Stack Overflow用户

发布于 2013-02-14 18:38:08

您的Oracle类不应具有验证类型的成员,而应具有类型为Handler的成员。

当然,这将被设置为某个地方的验证(我假设这将是链的第一步)。

现在你仍然要构建链,链的步骤不应该知道其他步骤。

现在有两种选择,一种是允许Oracle类知道链将如何操作,另一种是自己构建链(以及由此产生的所有依赖项)。或者,您需要一个构建器类来构建链并将其注入到Oracle实例中(最好是通过构造函数)。

第二种选择最好地遵循CoR模式的原理(链的用户不知道它的内部工作)。

也许ArgoUML将该链接添加到验证中是为了能够创建处理程序的实例,但这很奇怪。

此外,我认为setNext方法不属于Oracle类。这个类确实需要一个对链的第一个Handler对象的引用,但最好从构造函数中设置。如果通过setter设置,您应该给它一个适当的名称,如setHanlderChain,以使目的明确。

成功

在回复评论时:

责任链的一个元素并不了解这个链本身,它只是一个参与者。因此,您需要在某个地方创建链:实例化参与者并设置其下一步。

例如,这可能看起来像这样(请注意,我已经很长时间没有用C++编写任何严肃的东西了,我假设类图中的顺序就是执行的顺序)

代码语言:javascript
运行
复制
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类。

这样,类之间的依赖关系就最小化了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14866853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档