我有一个带有命令行界面的现有app,我正在添加GUI.经常出现的一种情况是,我有一个从一个类继承的对象列表,需要显示在列表中,但每个子类的显示方式略有不同.
不希望在任何地方使用反射/ RTTI进行显示的巨型switch语句,每个类都知道如何返回自己的汇总字符串,然后在列表中显示:
int position = 0; for (vector::const_iterator iDisp = listToDisplay.begin(); iDisp != listToDisplay.end(); ++iDisp) cout << ++position << ". " << iDisp->GetSummary();
类似的功能用于在不同的上下文中显示不同的信息.在我们需要添加GUI之前,这一切都很好.字符串不再足够 - 我需要创建图形控件.
我不想修改每个类以便能够在GUI中显示它 - 特别是因为至少还有一个GUI平台我们想要将它移动到.
是否有某种技术可以用来将这个GUI代码从数据对象中分离出来而不需要使用RTTI和switch语句?能够取出GetSummary函数会很高兴.
理想情况下,我可以拥有一个显示类的层次结构,可以获取数据类并根据运行时类型而不是编译时类型显示它:
shared_ptrdisplayer = new ConsoleDisplayer(); // or new GUIDisplayer() for (vector ::const_iterator iDisp = listToDisplay.begin(); iDisp != listToDisplay.end(); ++iDisp) displayer->Display(*iDisp);
Dan Williams.. 6
我认为这不会解决您不需要编写代码的问题,但您应该能够从数据对象中抽象出GUI逻辑.
查看访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern),它允许您在不更改对象本身的情况下将代码添加到现有对象.您还可以根据平台更改访问者.
我认为这不会解决您不需要编写代码的问题,但您应该能够从数据对象中抽象出GUI逻辑.
查看访问者模式(http://en.wikipedia.org/wiki/Visitor_pattern),它允许您在不更改对象本身的情况下将代码添加到现有对象.您还可以根据平台更改访问者.