听说数据和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对话框。有一种简单的方法可以通过在类 Data 中添加一个虚函数来实现,例如
virtual DataDialog* CreateDialog()
但是如果我在数据类中添加这个函数。它似乎违反了数据/GUI 分离原则。第二种方式是构建一个全局的CreateDialog函数,根据数据对象的dynamic_cast类型创建对话框。这种方式也不适用于许多手动 ifs。还有其他实现方式吗?或者在实践中,第一种方式也可以吗?非常感谢!
我的一个 friend 告诉我使用反射。我认为这应该可行。
最佳答案
您似乎在寻找 Abstract Factory .
抽象工厂是一种设计模式,可以根据参数创建不同类型的对象。因此在本例中,工厂将根据数据类型创建一个 ConcreteDataADialog
或一个 ConcreteDataBDilaog
。
代码草图:
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();
}
}
关于c++ - 如何分离分层数据和GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14178164/