我正在使用wxWidgets处理带有GUI的应用程序。我得到一个用作“模型”的对象:它的数据必须用于绘制ui,ui应该修改它。我们称这个班为Model
。
wxApp
派生的对象,拥有:
wxFrame
派生的对象,拥有一个
wxGLCanvas
- 派生对象。wxFrame
派生的对象。Model
类,我可以使用 singleton
会让事情变得非常简单:我
可以使用model.getThatData()
或model.setThatData()
任何地方。
但是,我不能不同意人们的意见 说它是一个全局变量 一件漂亮的连衣裙。
我也可以使用依赖
注射(或是它的东西
否则):我实现了Model
wxApp
对象,然后我传递了一个
引用实例model
in
两个wxFrame
派生类的构造函数,
wxGLCanvas
同样的事情
构造函数,我存储了
引用作为的属性
需要的课程。
然而,这似乎不是一个
很好的解决方案。假设
第一个wxFrame
对象不需要
使用model
。不过我们会
必须传递对model
的引用
在它的构造函数中能够
将它传递给wxGLCanvas
- 派生
宾语。所以设计可能导致
答案 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应用程序中的不良选项。)