Вот небольшой пример, который я сделал (не пытался его скомпилировать, дайте мне знать, если есть ошибки):
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 может вызывать при нажатии.
Прелесть этого в том, что модель и представление полностью независимы, реализация каждого из них может кардинально измениться, и это не повлияет на другое, контроллеру может просто потребоваться внести несколько изменений. Если модель в этом случае рассчитывает некоторый результат на основе данных базы данных, то нажатие кнопки может привести к тому, что это произойдет, но реализация кнопки не должна была бы измениться. Или вместо того, чтобы сообщать контроллеру, когда происходит щелчок, возможно, он может сообщить контроллеру, когда кнопка наведена. Те же изменения применяются к модели, независимо от того, что вызвало изменения.