您的 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 类。
这样,类之间的依赖关系就最小化了。