3

听说数据和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类型创建对话框。这种方式对许多 maual ifs 也不利。还有其他实现方式吗?还是在实践中,第一种方式也可以?非常感谢!

我的一位朋友告诉我使用反射。我认为这应该有效。

4

1 回答 1

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();
        }
}
于 2013-01-06T00:58:36.217 回答