java - 如何将参数传递给接口(interface)的一个实现者而不是其他实现者(不在构造函数中传递它)?

标签 java design-patterns interface

我正在处理的应用程序由配置文件和步骤组成。每个 Profile 由多个步骤组成,有 4 种步骤:

  • Sequential :完成此步骤后,按顺序转到下一步。
  • 跳转:此步完成后,跳转到ID步。
  • Evaluated :此步骤完成后,根据某种方法的结果确定下一步ID。
  • Terminal:这一步是最后一步。

我的Step 接口(interface)有一个名为public abstract Step getNextStep() 的抽象方法。每个步骤类型都根据需要实现此方法。

问题是 EvaluatedStep 需要一个参数,我们称它为 Parameter p,而其他步骤类型都不需要任何参数。

我通过将接口(interface)中的方法 header 更改为 public abstract Step getNextStep(Parameter p); 来解决这个问题,但我知道这不是一个好的解决方案。 执行此操作的更好方法是什么?

注意:

  • 我无法将 Parameter p 传递给 EvaluationStep 构造函数,因为该参数仅在需要调用 getNextStep() 时可用。
  • Parameter p 将来可能是不同参数的集合,因此解决此问题的方法必须灵活。换句话说,现在我只需要将 Parameter p 传递给 getNextStep() 但将来我可能需要传递一堆不同的参数 getNextStep(Parameter p,参数 a,Something s)我怎样才能避免这种情况

最佳答案

一种方法是在签名上使用可变参数,如下所示:

pubic abstract Step getNextStep(Object... parameters)

然后可以通过以下任何一种方式调用它:

seq.getNextStep();
eval.getNextStep(p);
future.getNextStep(p,a,s);

所有的都会匹配界面。在实现内部,如果需要,可以将它们作为数组成员引用:

public Step getNextStep(Object... parameters){
    if ( parameters.length > 0 && parameters[0] instanceof Parameter ){
        Parameter p = (Parameter) parameters[0];
    }
}

关于java - 如何将参数传递给接口(interface)的一个实现者而不是其他实现者(不在构造函数中传递它)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24762888/

相关文章:

java - android.view.InflateException : Binary XML file line #9: Binary XML file line #9: Error inflating class

c# - 抽象 UI 数据格式

design-patterns - Go walk trees的Erlang翻译

iphone - 基于#if评估的iOS接口(interface)声明

spring-boot - Spring 应用程序通过通用接口(interface)将组件共享到另一个应用程序

java - Google App Engine LogService 的开发/测试版本

java - 制作带有菜单的弹出窗口

java - SQL 登录验证 - 检查用户类型

c++ - "save"的设计模式

java - 如何为接口(interface)编写junit测试?