我有一个带有命令行界面的现有app,我正在添加GUI。经常出现的一种情况是,我有一个从一个类继承的对象列表,需要显示在列表中,但每个子类的显示方式略有不同。
不希望在任何地方都使用反射/ 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);
答案 0 :(得分:6)
我认为这不会解决您不需要编写代码的问题,但您应该能够从数据对象中抽象出GUI逻辑。
查看访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern)它将允许您在不更改对象本身的情况下将代码添加到现有对象。您还可以根据平台更改访问者。