4

GUI を追加するコマンドライン インターフェイスを備えた既存のアプリがあります。あるクラスから継承したオブジェクトのリストがあり、それをリストに表示する必要があるのに、サブクラスごとに表示方法が少し異なるという状況がよく発生します。

リフレクション/RTTI を使用して表示を行う巨大な switch ステートメントをどこにでも持ちたくないので、各クラスは、リストに表示される独自の要約文字列を返す方法を知っています。

int position = 0;
for (vector<DisplayableObject>::const_iterator iDisp = listToDisplay.begin(); iDisp != listToDisplay.end(); ++iDisp)
    cout << ++position << ". " << iDisp->GetSummary();

さまざまなコンテキストでさまざまな情報を表示するために、同様の関数があります。GUI の追加が必要になるまでは、これで問題ありませんでした。文字列だけでは不十分です。グラフィック コントロールを作成する必要があります。

GUI で表示できるようにするためにすべてのクラスを変更する必要はありません。特に、これを移動したい GUI プラットフォームが少なくとも 1 つあるためです。

RTTI や switch ステートメントに頼らずに、この GUI コードをデータ オブジェクトから分離するために使用できるテクニックはありますか? GetSummary関数も取り出せるといいですね。

理想的には、データ クラスを取り、コンパイル時の型ではなく実行時の型に基づいて表示できる表示クラスの階層を持つことができます。

shared_ptr<Displayer> displayer = new ConsoleDisplayer(); 
// or new GUIDisplayer()

for (vector<DisplayableObject>::const_iterator iDisp = listToDisplay.begin(); iDisp != listToDisplay.end(); ++iDisp)
    displayer->Display(*iDisp);
4

1 に答える 1

6

これでコードを書く必要がないという問題が解決するとは思いませんが、データ オブジェクトから GUI ロジックを抽象化できるはずです。

Visitor パターン ( http://en.wikipedia.org/wiki/Visitor_pattern ) を見ると、オブジェクト自体を変更せずに既存のオブジェクトにコードを追加できます。プラットフォームに基づいて訪問者を変更することもできます。

于 2008-12-26T19:26:07.530 に答える