4

我有一个带有命令行界面的现有应用程序,我正在向该应用程序添加 GUI。经常出现的一种情况是我有一个继承自一个类的对象列表,需要在列表中显示,但每个子类的显示方式略有不同。

不想到处都有巨大的 switch 语句使用反射/RTTI 进行显示,每个类都知道如何返回自己的摘要字符串,然后将其显示在列表中:

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

类似的功能可以在不同的上下文中显示不同的信息。在我们需要添加 GUI 之前,这一切都很好。字符串已经不够用了——我需要创建图形控件。

我不想修改每个单独的类以便能够在 GUI 中显示它——特别是因为我们至少希望将它移动到一个 GUI 平台。

是否可以使用某种技术将此 GUI 代码从数据对象中分离出来,而无需使用 RTTI 和 switch 语句?如果能够取出 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 逻辑。

查看访问者模式 ( http://en.wikipedia.org/wiki/Visitor_pattern ) 它将允许您将代码添加到现有对象而不更改对象本身。您还可以根据平台更改访问者。

于 2008-12-26T19:26:07.530 回答