Пример кода модели представления контроллера модели - PullRequest
10 голосов
/ 21 октября 2010

Я изучал шаблон проектирования Model-View-Controller, и я теоретически понимаю концепцию, лежащую в основе шаблона, но я хотел получить представление о том, как на самом деле применить его на практике.
В Википедии упоминается Wt - веб-инструментарий, CppCMS и некоторые другие стандартные реализации, в которых используется шаблон, однако я не был знаком с ними, и я просто надеялся и будет очень признателен, если кто-нибудь сможет предоставить пример кода (надеюсь, C ++), который реализует шаблон и объясняет теорию шаблона, применяемую на практике.

Ответы [ 4 ]

23 голосов
/ 21 октября 2010

Вот небольшой пример, который я сделал (не пытался его скомпилировать, дайте мне знать, если есть ошибки):

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's 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 голосов
/ 21 октября 2010

Простой текстовый редактор может быть разработан на основе MVC.Представьте себе класс string как модель, в которой хранятся данные.У нас может быть класс с именем SimpleTextView, который отображает текст в string, прикрепленный к нему, как есть.Класс с именем KeyboardEventHandler может выступать в качестве контроллера.Контроллер уведомит представление о новых событиях клавиатуры.Представление в свою очередь изменяет модель (например, добавление или удаление текста).Изменения в модели отражаются на всех привязанных к ней видах.Например, может быть другое представление с именем HtmlView, присоединенное к объекту string, которым манипулируют из SimpleTextView.Если пользователь вводит действительные теги HTML в SimpleTextView, HtmlView будет отображать форматированный вывод в режиме реального времени.

1 голос
/ 25 января 2017

Код - лучший подход для понимания и изучения 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 / C ++ Model-View-Controller Объяснено в C ++

MVC

1 голос
/ 21 октября 2010

Есть пара полных примеров MVC, а также обсуждение, в гл. 2 введения к программированию в Python 3.x, которое я написал (я не закончил гл. 3 и т. Д., Этот проект был на льду в течение некоторого времени -- Сообществу Python очень нравилось злобное стадо пчел, когда я обнаружил, что я написал, что Python, возможно, не подходит для очень крупномасштабных разработок, поэтому стало трудно получить разумную обратную связь).Он доступен в формате PDF из Документов Google .Я не знаю, насколько хорошо он соответствует общепринятым реализациям MVC, меня больше всего интересовало, как донести общую идею.: -)

Приветствия & hth.,

PS: в PDF-файле есть хорошее оглавление, но в Документах Google его нет.Вы должны будете использовать Foxit, Acrobat или какой-либо другой просмотрщик PDF.Я думаю, что в Google Docs есть отдельное видимое оглавление, но я не проверял и не помню, обновлялся ли он.

PPS: Забыл упомянуть, что пример обработки изображений MVC ближе к концу имеет симпатичную фотографию ЛеныSöderberg!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...