【问题标题】:Chain of responsibility pattern C++责任链模式 C++
【发布时间】:2013-02-14 02:26:02
【问题描述】:

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

在此图中,Oracle 类是一个“客户端”。 Oracle.cpp 构造方法有下一行

#include "Oracle.h"
Oracle::Oracle(){
    Validation v;//Here
}

在这里我得到“错误:'验证'没有在这个范围内声明”。我的问题:是否有必要创建从 Oracle 到验证的 UML 关系“依赖关系”?或者我将如何解决这个错误?

【问题讨论】:

  • 您是否将 Validation.h 包含到 Oracle.cpp 中?
  • 您的问题似乎是关于使用 ArgoUML,而不是关于责任链模式。也许你应该改变标题。
  • @Deamonpog not 我没有在 Oracle 中包含 Validation.h,因为这会修改模式责任链的 UML 图。
  • @Ergwun 我认为这个问题与工具无关。
  • 那么Oracle.cpp将无法获取数据类型名称Validation,并且会一直报编译错误。自动生成的代码异常是这样的:P。至少在顶部放上class Validation; 之类的东西。

标签: c++ design-patterns chain-of-responsibility argouml


【解决方案1】:

您的 Oracle 类不应具有 Validation 类型的成员,而应具有 Handler 类型的成员。

这当然会在某处设置为验证(我假设这将是链的第一步)。

现在你还是要建链,链的步骤应该不知道其他步骤。

现在有两个选项,要么允许 Oracle 类知道链将如何运行,要么它可以自己构建它(包括所有产生的依赖关系)。 或者您需要一个构建器类来构建链并将其注入 Oracle 实例(最好通过构造器)。

第二个选项最好遵循 CoR 模式的理念(链的用户不知道其内部工作)。

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

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

成功

回复cmets:

责任链中的一个元素不了解链本身,它只是一个参与者。 所以你需要在某个地方创建链:实例化参与者并设置他们的下一步。

对于你的例子,这可能看起来像这样(请注意,我已经很久没有用 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)设置为构建方法的结果。将实例化 Oracle 类的类需要同时导入 Oracle 类和 OracleHandlerChainBuilder 类。

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

【讨论】:

  • 请向您解释“或者您需要一个构建器类来构建链并将其注入 Oracle 实例(最好通过构造器)。”。我是使用这种模式的新手。
  • 在 C++ 中有多个文件的这种模式的例子吗?。
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多