使用覆盖方法添加特定组件

时间:2017-01-12 14:07:33

标签: java oop design-patterns wicket

实现扩展抽象超类的一些类的最佳方法是什么,其中每个类总是添加一个组件,但组件可能不同?

我定义了一个实现拖放行为的抽象类,并有一个显示和编辑某个字段的组件。特定组件不同,在某些情况下,字段可能为空,可能有多个字段,依此类推。 在抽象类中,我通过抽象的getComponent()方法添加组件。子类提供自己的实现。 子类使用在构造函数中传递的不同字段,或者从构造函数中提供的参数计算。

这些字段在超级构造函数调用中尚不可用,因此在构造时不能在抽象类中调用getComponent()方法。 workaroud是在onInitialize()中添加Component,或者只是将它留给实现类来添加组件(或不是?)但是整个方法可能是反模式。

代码段:

       public abstract class AbstractContainer extends Panel {

   AbstractContainer( String markupId, IModel<> somemodels ..) 
  {
       super( markupId );
       this.setOutputMarkupId( true );

       this.add( new DragDropBehavior( "result" ) {
       //some stuff
       });

       // cannot do this.add(getComponent()) here
       // implementations use fields that have not been set 
       // yet in child classes
   }

   abstract protected Component getComponent();
 }


    public class MyPanel extends AbstractContainer {
     IModel mySpecificFieldModel;

     MyPanel( String markupId, IModel<> somemodels, IModel mySpecificFieldModel)
   {
      super( somemodels );
      this.mySpecificFieldModel=mySpecificFieldModel;
   }

   protected Component getComponent() 
  {
       Component component = new MyComponent("id",  this.mySpecificFieldModel);
       return component;
  }
}

2 个答案:

答案 0 :(得分:0)

也许Composite模式可以帮助你

答案 1 :(得分:0)

onInitialize()调用可覆盖的工厂方法是Wicket中常见的模式:

protected void onInitialize() {
    add(newContent("contentId"));
}

protected abstract Component newContent(String id);