Я изучал модельный шаблон Model-View-Controller, и я понимаю концепцию шаблона теоретически, но я хотел получить представление о том, как это можно было бы применить на практике.
Википедия упоминает Wt-Web toolkit, CppCMS и некоторые другие стандартные реализации, которые используют шаблон, но я не знаком с ними, и я просто надеялся и
будет очень благодарен. Если кто-то может предоставить некоторый пример кода (надеюсь, С++), который реализует шаблон и объясняет теорию шаблона, применяемого к практике.
Модельный шаблон проектирования модели Код примера
Ответ 1
Вот быстрый пример, который я сделал (не пробовал компилировать его, дайте мне знать, если есть ошибки):
class Button; // Prewritten GUI element
class GraphGUI {
public:
GraphGUI() {
_button = new Button("Click Me");
_model = new GraphData();
_controller = new GraphController(_model, _button);
}
~GraphGUI() {
delete _button;
delete _model;
delete _controller;
}
drawGraph() {
// Use model data to draw the graph somehow
}
...
private:
Button* _button;
GraphData* _model;
GraphController* _controller;
};
class GraphData {
public:
GraphData() {
_number = 10;
}
void increaseNumber() {
_number += 10;
}
const int getNumber() { return _number; }
private:
int _number;
};
class GraphController {
public:
GraphController(GraphData* model, Button* button) {
__model = model;
__button = button;
__button->setClickHandler(this, &onButtonClicked);
}
void onButtonClicked() {
__model->increaseNumber();
}
private:
// Don't handle memory
GraphData* __model;
Button* __button;
};
Игнорируя реализацию Button, в основном эта программа будет использовать GraphGUI для отображения графика, который будет изменяться при нажатии кнопки. Скажем, это гистограмма, и она станет выше.
Поскольку модель не зависит от представления (кнопки), а контроллер обрабатывает связь между ними, это следует за шаблоном MVC.
При нажатии кнопки контроллер изменяет модель с помощью функции onButtonClicked, которую класс Button знает для вызова при нажатии.
Красота этого заключается в том, что модель и представление полностью независимы, реализация каждого из них может кардинально измениться, и это не повлияет на другое, контроллер может просто внести несколько изменений. Если модель в этом случае рассчитала некоторый результат, основанный на некоторых данных базы данных, тогда нажатие кнопки может привести к тому, что это произойдет, но реализация кнопки не потребуется изменять. Или, вместо того, чтобы указывать контроллеру при щелчке, возможно, он может сообщить контроллеру, когда кнопка перепутана. Те же изменения применяются к модели, независимо от того, что вызвало изменения.
Ответ 2
Простой текстовый редактор может быть разработан на основе MVC. Подумайте о классе string
как о модели, где хранятся данные. У нас может быть класс с именем SimpleTextView
, который отображает текст в string
, прикрепленный к нему, как есть. В качестве контроллера может выступать класс под названием KeyboardEventHandler
. Контроллер уведомит мнение о новых событиях клавиатуры. Представление, в свою очередь, изменяет модель (например, добавление или удаление текста). Изменения в модели отражены во всех прикрепленных к ней взглядах. Например, может быть другое представление под названием HtmlView
, прикрепленное к объекту string
, управляемому из SimpleTextView
. Если пользователь вводит допустимые теги HTML в SimpleTextView
, HtmlView
будет отображать отформатированный вывод в режиме реального времени.
Ответ 3
Есть пара полных примеров MVC, плюс обсуждение, в ch 2 введения в программирование в Python 3.x, который я написал (я не закончил ch 3 и т.д., этот проект был на льду в течение некоторого времени - - Сообщество Python действительно похоже на сердитый рой пчел, когда я обнаружил, что написал, что Python, возможно, не подходит для очень масштабного развития, поэтому стало трудно получить разумную обратную связь). Он доступен в формате PDF из Документов Google. Я не знаю, насколько хорошо он сопоставляется с обычными реализациями MVC, я был в основном заинтересован в том, чтобы получить общую идею.: -)
Приветствия и hth.,
PS: В файле PDF есть приятное оглавление, но Google Docs не показывает его. Вам понадобится dl и использовать Foxit или Acrobat или какой-либо другой просмотрщик PDF. Я думаю, что в Google Docs есть отдельный просматриваемый TOC, но он не проверял и не помнит, обновлялся ли он.
PPS: Забыл упомянуть, пример обработки изображений MVC в конце имеет приятный рисунок Лены Сёдерберг!:)
Ответ 4
Код - лучший подход для понимания и изучения Model View Controller:
Вот простой пример JS (из Wiki)
/** Model, View, Controller */
var M = {}, V = {}, C = {};
/** Model stores data */
M.data = "hello world";
/** View controls what to present */
V.render = (M) => { alert(M.data); }
/** Controller bridges View and Model */
C.handleOnload = () => { V.render(M); }
/** Controller on Windows OnLoad event */
window.onload = C.handleOnload;
Вот подробный пост в C/С++ Model-View-Controller, объясненный на С++