0

假设为了讨论,我有以下经典层次结构:

abstract class Vehicle {
  private int cost; 
  // imagine the usual getters and setters here
}

class Car extends Vehicle {
  private String make, model, year; 
  // getters and setters
}

class Plane extends Vehicle {
  private int yearIntroduced;
  // getter and setter
}

现在假设在我的支持 bean 中有一个 Vehicle 实例列表bb.vehicles。如何支持统一编辑?我不知道如何避免这种代码:

<ui:repeat value="#{bb.vehicles}" var="vehicle">
  <!-- this is where the trouble begins -->
  <app:editCar      car="#{vehicle}"  rendered="#{test vehicle to see if it is a car}"/>
  <app:editPlane  plane="#{vehicle}"  rendered="#{test vehicle to see if it is a plane}"/>
</ui:repeat>

这似乎是对正确 OO 设计的侮辱,这似乎表明车辆本身应该以某种方式参与正确视图的选择,而不是视图检查它并自行决定。我在我的代码中的很多地方都看到了这种模式,其中我有一个半异构集合或一个对象上的一个属性,该对象必须是一个类或其子类之一的实例,我需要一个特殊的编辑器来公开什么使子类不同。好像有异味,想问问有没有更好的办法。

4

1 回答 1

0

通常,您的支持 bean 中可能应该有一些东西来包装车辆,并提供一个 xhtml 文件以包含以编辑该特定车辆类型(或者如果您愿意,也可以使用约定)。这样,您的 jsf 文件中就没有任何特定内容。只需使用 ui:include 并调用车辆支持 bean 上的属性。

于 2012-05-17T02:43:03.693 回答