【问题标题】:I don't want to use InstanceOf multiple times or a Visitor pattern我不想多次使用 InstanceOf 或访客模式
【发布时间】:2022-01-11 22:26:45
【问题描述】:

我正在寻求有关 Java (1.8) 问题的帮助。 我有一个类(我会在下面说),它有多个具有相同名称的方法,使用不同类型的参数,但都继承了同一个接口。 我想使用接口和 java 中的变量调用此方法,以使用调整后的方法,主要是为了避免使用多个 instanceof ... 或访问者模式,我认为这会大大提高我会避免的代码复杂性。

这是课程:

public class BoxAdapterToRenderer {
public static Node createRenderer(Fighter fighter){
    Rectangle fighterRenderer = new Rectangle();
    fighterRenderer.setHeight(50);
    fighterRenderer.setWidth(50);
    Image im = new Image(Constants.ruleReader.getFighterImageURL(fighter.getName()),false);
    fighterRenderer.setFill(new ImagePattern(im));
    return fighterRenderer;
}

public static Node createRenderer(Bomb bomb){
    Rectangle bombRenderer = new Rectangle();
    bombRenderer.setHeight(50);
    bombRenderer.setWidth(50);
    Image im = new Image(Constants.ruleReader.getBombImageURL(),false);
    bombRenderer.setFill(new ImagePattern(im));
    return bombRenderer;
}

public static Node createRenderer(Mine mine){
    Rectangle mineRenderer = new Rectangle();
    mineRenderer.setHeight(50);
    mineRenderer.setWidth(50);
    Image im = new Image(Constants.ruleReader.getMineImageURL(),false);
    mineRenderer.setFill(new ImagePattern(im));
    return mineRenderer;
}

public static Node createRenderer(StaminaPad staminaPad){
    Rectangle staminaPadRenderer = new Rectangle();
    staminaPadRenderer.setHeight(50);
    staminaPadRenderer.setWidth(50);
    Image im = new Image(Constants.ruleReader.getStaminaPadImageURL(),false);
    staminaPadRenderer.setFill(new ImagePattern(im));
    return staminaPadRenderer;
}

这里是一个调用的例子:

Box box = board.getGrid()[i][j];
BoxAdapterToRenderer.createRenderer(box)

所以这里我的界面是 Box,我的不同继承类是 Fighter、bomb、mine 等... 这里java不想编译,因为它没有检测到带有Box类型参数的createRenderer

我还想补充一点,Box 及其不同的继承者是全局 MVC 模式模型的一部分,此处的 createRenderer 方法在视图中调用,并且视图根本不应该考虑模型, 通常在 Box 中定义 createRenderer 方法不是解决方案。

【问题讨论】:

  • 对我来说,Box 接口似乎应该有方法 createRenderer,而 Mine、StaminaPad、Bomb、Fighter 类将以不同的方式实现它们(而不是在 BoxAdapterToRenderer 类中)。
  • 感谢和抱歉,我更新了我的问题,我忘了提及您的解决方案在此处无法工作的 MVC。
  • 看看en.wikipedia.org/wiki/Multiple_dispatch。在 Java 中可能是不可能的。

标签: java instanceof


【解决方案1】:

我认为您正在寻找这样的东西:

interface Box
{
  Node createRenderer();
}

class Fighter implements Box
{

  @Override
  public Node createRenderer() {
    //TODO: implement this
    return null;
  }
}

class Bomb implements Box
{
  //TODO: implement this
  @Override
  public Node createRenderer() {
    return null;
  }
}

class Mine implements Box
{
  //TODO: implement this
  @Override
  public Node createRenderer() {
    return null;
  }
}

class StaminaPad implements Box
{
  //TODO: implement this
  @Override
  public Node createRenderer() {
    return null;
  }
}

调用示例:

Box box = board.getGrid()[i][j];
box.createRenderer();

您拥有描述所有盒子应该具有的行为的界面 Box。 然后每个实现此接口的类都将拥有自己定义的方法的实现。假设board包含不同的实现Box接口的对象,那么你可以调用方法.createRenderer()而不需要检查这些对象的具体实现。

【讨论】:

  • 感谢和抱歉,我更新了我的问题,我忘了提及您的解决方案在此处无法工作的 MVC。
猜你喜欢
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
相关资源
最近更新 更多