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分離の原則に違反しているようです。2番目の方法は、グローバルなCreateDialog関数を作成し、dynamic_castタイプのデータオブジェクトに従ってダイアログを作成することです。この方法は、多くのmaualifにも適していません。それを実装する他の方法はありますか?または実際には、最初の方法も大丈夫ですか?どうもありがとう!

友達の一人がリフレクションを使うように言った。これでうまくいくと思います。

4

1 に答える 1

3

抽象ファクトリを探しているようです。

抽象ファクトリは、引数に応じてさまざまなタイプのオブジェクトを作成できるデザインパターンです。したがって、この例では、ファクトリはデータのタイプに応じて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 に答える