2013-01-06 76 views
3

我听说分离数据和GUI更好。例如,我有一些数据。这是分层次的抽象的基础和具体类型的派生类,像如何分离分层数据和GUI?

class Data {}; 
class ConcreteDataA : public Data {}; 
class ConcreteDataB : public Data {}; 

而且我也有其层次GUI(例如,对话框)

class DataDialog {}; 
class ConcreteDataADialog : public DataDialog {}; 
class ConcreteDataBDilaog : public DataDialog {}; 

而且我想创建一个数据对话框对象数据对象。如果数据对象是ConcreteDataA,则创建ConcreteDataADialog,如果创建了B,B对话框。有一个简单的方法通过添加类数据的虚拟函数一样

virtual DataDialog* CreateDialog() 

做,但如果我在数据类中添加此功能。它似乎违反了数据/ GUI分离原则。第二种方法是构建一个全局的CreateDialog函数,并根据dynamic_cast类型的数据对象创建对话框。这种方式对于许多马夫人来说也不是很好。任何其他方式来实现它?或者在实践中,第一种方式也行吗?非常感谢!

我的一个朋友告诉我使用反射。我认为这应该工作。

回答

3

看来你正在寻找一个Abstract Factory

抽象工厂是一种设计模式,根据参数可以创建不同类型的对象。因此,在此示例中,工厂将根据数据类型创建一个ConcreteDataADialogConcreteDataBDilaog

代码素描:

class DialogFactory { 
public: 
    virtual Dialog* createDialog() = 0; 
}; 

class ADialogFactory : public DialogFactory { 
public: 
    Dialog* createDialog() { 
     return new ADialog(); 
    } 
}; 

class BDialogFactory : public DialogFactory { 
public: 
    Dialog* createDialog() { 
     return new BDialog(); 
    } 
}; 

class Application { 

    Dialog* createSpecificDialog(Data data) { 
     if (data.isA()) { 
      return new ADialogFactory().createDialog(); 
     } else { 
      return new BDialogFactory().createDialog(); 
     } 
} 
+0

你能与我的情况下,一些简单的代码显示它?非常感谢! – user1899020

+1

@ user1899020我加了一个例子。 –

+0

这似乎与我手动ifs的第二种方式类似。谢谢。 – user1899020