MVP Passive View подход с FLTK

У меня есть очень простая проблема, пытаясь использовать FLTK с MVP Passive View, как описано Вот. Мне удалось это сделать, но я чувствую себя не так, как я.

У меня есть Fl_Window, содержащий некоторые виджеты и Fl_Gl_Window для функциональности OpenGL.
Как вы знаете, вы можете добавлять виджеты и прочее в Fl_Window между begin() а также 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, оба окна являются представлениями (один View содержащий другое). каждый View необходимо общаться с Presenter и как показано на диаграмме последовательности Fowler, View должен содержать ссылку на Presenter и наоборот. Поэтому я использовал предварительное объявление в заголовках интерфейса.

Как уже упоминалось, я хочу знать, есть ли лучший способ сделать это. Может быть, как-то можно добавить Fl_Gl_Window без необходимости создавать его на этом этапе. Или, может быть, мой MVP Passive View подход неверен.

Я надеюсь, что мое объяснение понятно.
Заранее спасибо за помощь!

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]