gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:25:20 28 4
gpt4 key购买 nike

听说数据和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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com