c++ - 如何分离分层数据和GUI?

标签 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对话框。有一种简单的方法可以通过在类 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/

相关文章:

c++ - 从 Mat 元素到 IplImage * 的 opencv 转换

c++ - 我无法理解 c 风格转换之间的区别(例如 :- A a;B *b;b = (*B) (&a);) and dynamic_cast<B*>(&a);

c++ - C++ 中自行实现的线程安全字符串缓冲区

将另一个 DLL 链接到项目后,C++ DLL 加载失败

c++ - 运行容器类程序时显示错误

c++ - Qt QLCDNumber QTimer 数字时钟刻度

c++ - 如何从成员函数返回对新对象实例的引用(在某些操作之后)?

c++ - 将 Armadillo 添加到 Qt 项目

c++ - 将一个字符与 C++ 中的各种字符类进行比较

c++ - C++ 中的递归深度优先搜索 (DFS) 算法