根据具体对象类型显示动态UI?

时间:2011-03-23 13:15:49

标签: design-patterns user-interface derived-class

我有一个基类和几个从中派生出来的具体类。让我们说它看起来像这样:

abstract class Base
{
    public int id;
    public string baseVariable;
}

class ConcreteA extends Base
{
    public string propertyA;
    public float propertyB;
}

class ConcreteB extends Base
{
    public decimal propertyC;
    public RandomClass propertyD;
}

让我们说UI是一个很大的开放空间,有一堆具体的对象,它们来自于它周围的Base。在此视图中,您只需要通用idbaseVariable属性即可获得显示通用对象所需的内容。如果双击其中一个对象,它将弹出一个窗口,您可以在其中编辑其中的Base和Concrete对象的所有属性。

在该窗口中,我希望根据我拥有的具体对象类型以及用于修改常见Base属性的静态加载选项卡动态加载选项卡。是否有一个很好的设计模式来实现这样的东西?

似乎我应该避免这种情况:

class PopUpWindow
{
    public PopUpWindow(object:Base)
    {
        tabs.add(BaseTab);

        switch(typeOf(object))
        {
            case ConcreteA:
                tabs.add(ConcreteATab);
            case ConcreteB:
                 tabs.add(ConcreteBTab);
        }
    }
}

但我也不认为我应该像对象一样在对象中混合UI东西:

public PopUpWindow(object:Base)
        {
            tabs.add(BaseTab);
            tabs.addAll(object.TabsToShowOnEdit);
            ...

有任何想法或建议吗?抱歉这个冗长的问题。提前谢谢。

1 个答案:

答案 0 :(得分:1)

一种方法是建立一个工厂,根据模型类型注册视图类型:

class ViewFactory
{
  // Can be populated from outside this class
  Dictionary<Type, Type> viewTypeByModelType;

  Control CreateView(Object model)
  {
    return (Control)Activator.CreateInstance(viewTypeByModelType[model.GetType()]);
  }
} 

然后,您可以在填充PopupWindow时轻松使用工厂:

 tabs.add(ViewFactory.CreateView(object));