如何分离分层数据和GUI?

时间:2013-01-06 00:54:28

标签: c++

我听说分离数据和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也不好。有没有其他方式来实现它?或者在实践中,第一种方式也没关系?非常感谢!

我的一个朋友告诉我要用反射。我认为这应该有用。

1 个答案:

答案 0 :(得分: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();
        }
}