0

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

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

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

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

4

1 回答 1

1

您的 Oracle 类不应具有 Validation 类型的成员,而应具有 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 类必须仅导入 Handler。

在您创建 Oracle 实例的地方,您将其链(在您的情况下使用 setNext)设置为构建方法的结果。将实例化 Oracle 类的类需要同时导入 Oracle 类和 OracleHandlerChainBuilder 类。

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

于 2013-02-14T10:38:08.113 回答