Java 如何处理复合模式在一个柳条般的方式?

Java 如何处理复合模式在一个柳条般的方式?,java,wicket,composite,wicket-6,Java,Wicket,Composite,Wicket 6,在任何Wicket repeater组件中,基于模型对象类使用不同组件类的常见模式是什么?我目前的方法是这样的,但我想有一种更好的解决方案: BaseClass |- AClass |- BClass `- CClass protected void populateItem(Item<BaseClass> item) { BaseClass obj = item.getModelObject(); if (obj instanceof AClass) {

在任何Wicket repeater组件中,基于模型对象类使用不同组件类的常见模式是什么?我目前的方法是这样的,但我想有一种更好的解决方案:

BaseClass
|- AClass
|- BClass
`- CClass


protected void populateItem(Item<BaseClass> item) {
    BaseClass obj = item.getModelObject();
    if (obj instanceof AClass) {
        item.add(new APanel("content", Model.of((AClass) obj)));
    } else if (obj instanceof BClass) {
        item.add(new BPanel("content", Model.of((BClass) obj)));
    } else if (obj instanceof CClass) {
        item.add(new CPanel("content", Model.of((CClass) obj)));
    }
}
基类
|-A类
|-B类
`-C类
受保护的无效填充项(项){
BaseClass obj=item.getModelObject();
if(AClass的obj实例){
添加项(新附件(“内容”,型号((AClass)obj));
}else if(B类的obj实例){
添加项目(新BPanel(“内容”,型号((B类)obj));
}else if(类的obj实例){
添加项目(新CPanel(“内容”,型号((C类)obj));
}
}

在小型解决方案中,我可能会使用您的方法(可能使用
映射,但并不太重要)。如果不同的路径需要不同的标记,请使用wicket片段

<html xmlns:wicket="http://wicket.sourceforge.net/">
<wicket:panel>
    <table>
        <tr wicket:id="lista">

            <td><span wicket:id="label"></span></td>
            <td><span wicket:id="dynamicValue"></span></td>
        </tr>

    </table>
    <wicket:fragment wicket:id="memoValue">
        <textarea wicket:id="value" cols="100" rows="15"></textarea>
    </wicket:fragment>

    <wicket:fragment wicket:id="smallValue">
        <input wicket:id="value"></input>
    </wicket:fragment>

    <wicket:fragment wicket:id="comboValue">
        <select wicket:id="value"></select>
    </wicket:fragment>

</wicket:panel>
</html>

@覆盖
受保护的void populateItem(列表项){
final IFieldDescription poz=item.getModelObject();
System.out.println(“开始:+poz.getLabel());
添加(新标签(“Label”,poz.getLabel());
if(IVirtualField的poz实例){
片段片段=新片段(“dynamicValue”、“smallValue”、ValuesPanel.this);
TextField;
fragS.add(tf=新文本字段(“值”),新模型(“极线”);
tf.setEnabled(false);
添加项目(fragS);
返回;
}
if(IRelationFieldDescription的poz实例){
IRelationFieldDescription rel=(IRelationFieldDescription)poz;
片段片段=新片段(“dynamicValue”、“comboValue”、ValuesPanel.this);
SingleFieldModel=新的SingleFieldModel(可拆卸的RVModel,poz);
关系选择;
tf=新的RelationDropDownChoice(“value”,model,新的可分离的rtypeModel(rel.getSlave());
添加碎片(tf);
//tf.setEnabled(false);
添加项目(fragS);
返回;
}
if(poz实例字段){
Fragment fragM=新片段(“dynamicValue”,“memoValue”,ValuesPanel.this);
SingleFieldModel=新的SingleFieldModel(可拆卸的RVModel,poz);
fragM.add(新文本区域(“值”,模型));
//IModel imo=新
//模型(poz.getLength());
//tf.添加(新属性“最大长度”,imo,”);
//IModel siz=新车型(50);
//tf.添加(新属性“尺寸”,imo“”);
添加项目(fragM);
System.out.println(“备注:+poz.getLabel());
返回;
}
{
片段片段=新片段(“dynamicValue”、“smallValue”、ValuesPanel.this);
SingleFieldModel=新的SingleFieldModel(可拆卸的RVModel,poz);
TextField;
fragS.add(tf=新文本字段(“值”,模型));
IModel imo=新模型(poz.getLength());
tf.添加(新属性“最大长度”,imo,”);
IModel siz=新车型(50);
添加(新属性“大小”,大小,”);
System.out.println(“Single:+poz.getLabel());
添加项目(fragS);
}
}

您可以使用主页外部的factory模式。工厂中的代码看起来与您已有的代码类似

protected void populateItem(Item<BaseClass> item) {
  item.add(PanelFactory.getPanel("content", item.getModelObject());
}
protectedvoid populateItem(项目){
add(PanelFactory.getPanel(“内容”,item.getModelObject());
}
protected void populateItem(Item<BaseClass> item) {
  item.add(PanelFactory.getPanel("content", item.getModelObject());
}