使用FLTK的MVP被动视图方法

时间:2014-06-26 09:11:51

标签: c++ mvp fltk passive-view

我有一个非常基本的问题,尝试使用FLTK和MVP Passive View,如here所述。我设法做到了,但我觉得这样做不对。

我有一个Fl_Window,包含一些Widgets和一个Fl_Gl_Window的OpenGL功能。 如您所知,您可以在Fl_Windowbegin()之间的end()添加小部件和内容。当你在这些电话之间直接添加它时,似乎你必须实例化所有内容,所以我得到了类似的东西:

(请查看旁边的评论中的小“故事”)代码,因为它解释了我在做什么,我想知道在这种情况下这是否正常,或者有人可以指出我更好的解决方案,因为它确实感觉不对。

的main.cpp

int main(/*arguments*/) {
    Model* model = new Model();
    IPresenter* presenter = new Presenter(model); //Presenter only knows the model at this point
    IView* view = new View(presenter);           //View gets reference to the presenter...
}

View.h

class View : public Fl_Window {
public:
    View(IPresenter* presenter);
    virtual ~View();
private:
    IView* gl_window;
    IPresenter* presenter;
};

View.cpp

View::View(IPresenter* presenter) :Fl_Window(/*arguments*/) {
    this->presenter = presenter;
    begin();
    //add some Widgets
    gl_window = new GlWindow(this->presenter,/*more arguments*/); //...instantiates GlWindow and passes the received reference to it...
    end();
    show();
    Fl::run();
}

GlWindow.h

GlWindow::GlWindow(IPresenter* presenter, /* more arguments*/) :
    Fl_Gl_Window(/*arguments*/), IView() {
    //initialisations
    this->presenter = presenter;      //...which GlWindow uses for communication and...
    this->presenter->setView(this);   //...to set itself as reference to the presenter
                                      //same with View
}

IPresenter.h

class IView;   //forward declaration because IPresenter includes IView and vice versa

class IPresenter {
public:
    //pure virtual methods
};

IView.h与IPresenter.h相同。

因为我想要MVP,所以两个Windows都是视图(一个View包含另一个)。每个View都需要与Presenter进行通信,并且如序列图中Fowler所示,View需要保留对PresenterFl_Gl_Window的引用反之亦然。所以我在接口头文件中使用了forward声明。

如前所述,我想知道,如果有更好的方法可以做到这一点。也许在某种程度上可以添加MVP Passive View而不必在此时实例化它。或者我的{{1}}方法可能不正确。

我希望我的解释是可以理解的。 在此先感谢您的帮助!

0 个答案:

没有答案