Модельный шаблон проектирования модели Код примера

Я изучал модельный шаблон 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, объясненный на С++

MVC