GUI应用程序和单例/依赖注入

时间:2010-07-30 19:04:21

标签: c++ dependency-injection singleton wxwidgets

我正在使用wxWidgets处理带有GUI的应用程序。我得到一个用作“模型”的对象:它的数据必须用于绘制ui,ui应该修改它。我们称这个班为Model

应用程序的结构如下所示:

wxApp派生的对象,拥有:

  • 一个wxFrame派生的对象,拥有一个 wxGLCanvas - 派生对象。
  • 另一个wxFrame派生的对象。

对于Model类,

  1. 我可以使用 singleton 会让事情变得非常简单:我 可以使用model.getThatData()model.setThatData()任何地方。

    但是,我不能不同意人们的意见 说它是一个全局变量 一件漂亮的连衣裙

  2. 我也可以使用依赖 注射(或是它的东西 否则):我实现了Model wxApp对象,然后我传递了一个 引用实例model in 两个wxFrame派生类的构造函数, wxGLCanvas同样的事情 构造函数,我存储了 引用作为的属性 需要的课程。

    然而,这似乎不是一个 很好的解决方案。假设 第一个wxFrame对象不需要 使用model。不过我们会 必须传递对model的引用 在它的构造函数中能够 将它传递给wxGLCanvas - 派生 宾语。所以设计可能导致

  3. 你怎么看?我一直在问自己这个问题很长一段时间......

3 个答案:

答案 0 :(得分:2)

  

然而,这似乎不是一个非常好的解决方案。假设第一个wxFrame对象不需要使用模型。但是,我们将不得不在其构造函数中传递对模型的引用,以便能够将其传递给wxGLCanvas派生的对象。因此,这种设计可能导致许多(?)不必要的通过。

传递指针是花生,而不是解开隐藏在实现(==单例)中的类/对象之间的依赖关系的噩梦。

#2就是我这样做的方式。目标是只需通过查看类声明就可以了解类的先决条件。理想情况下,如果在上下文中我拥有c'tor / init方法所需的一切,我应该能够实例化并使用该对象。这样,生命周期也变得清晰:在释放对象之前,可能不会释放先决条件。

答案 1 :(得分:1)

框架是否依赖于特定的画布类?或者画布对象可以互换吗?

如果是后一种情况,则应通过对canvas对象的引用来参数化帧的构造函数。这样,应用程序将负责实例化模型,使用所述模型创建画布,并将画布传递给框架。框架将不再直接依赖于模型。

如果框架依赖于特定的画布类(即,框架实例化其自己的画布,并且知道它想要什么类型的画布)。然后,如果画布的构造函数依赖于Model对象,则通过代理,您的帧也依赖于模型。所以#2是正确的。

答案 2 :(得分:1)

将它放入一个简单的MVC模型中。 (回想一下,C与M和V相互作用,而M和V不相互作用。)

你的模型(显然)是MVC中的“M”。你的小部件是MVC中的“V”。

在这里查看问题?你试图把“M”给“V”;你错过了“C”来委派一切。你的“C”可能是你的wxApp(这取决于你想要如何设计东西)。

换句话说,控制器应该将视图所需的数据从模型提供给视图;视图不应直接从模型中获取自己的数据。

(因此,在我看来,你的两个提案都是MVC应用程序中的不良选项。)