我听说分离数据和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类型的数据对象创建对话框。这种方式对许多maual ifs也不好。有没有其他方式来实现它?或者在实践中,第一种方式也没关系?非常感谢!
我的一个朋友告诉我要用反射。我认为这应该有用。
答案 0 :(得分:3)
您似乎正在寻找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();
}
}