在C++中使用全局update()函数的Obsever模式(或类似的模式)

The Obsever pattern (or something similar) using a global update() function in C++?

本文关键字:模式 C++ Obsever 函数 全局 update      更新时间:2023-10-16

我正在C++中创建一个MVC应用程序,我希望较低级别的模型类能够用简单的文本更新GUI,以向读取器显示输出。我不想到处传递函数或对象指针,因为这会变得一团糟,我必须到处传递它们。我本质上想要的是相当于控制台GUI的"cout"——某种全局函数,可以在任何地方调用它来更新GUI,而不必了解GUI。

我在标题中提到了Observer模式,因为它听起来很像——GUI可以以某种方式订阅这个全局对象或函数,并在调用它时监听它。然而,我并不是专门寻找使用Observer的解决方案。

人们已经向我提到了信号和插槽,但当然,除非是全局的,否则你仍然需要"传递东西",以允许对象发出信号。同样,一个全球性的参考点将是有益的。

如何在确保遵守良好设计原则的同时做到这一点?

实际上,在这里使用Observer模式似乎是合适的。然而,我认为你在这里有一些错误。您需要清楚地定义每个参与方的角色。我建议使用以下分区:GUI是观察者(即侦听器(,较低级别的对象是向侦听器发出更改信号的对象。初始化后,较低级别的模块将向GUI(观察器(注册自己。一旦发生更改,较低级别的模块将执行观测者的公共侦听处理程序,提供所需的数据作为输入。

这将使您能够实现您的目标,并且该计划不涉及任何全局性因素。

您可以使用stdoutstderr来执行此操作。只需将它们的输出重定向到您的应用程序即可。最简单的解决方案是将应用程序输出重定向到文件,并使用tail -f redirected_output_file_name查看更新。

或者,您可以使用log4cxx,在这种情况下需要实现自定义的appender。