模型视图控制器设计模式代码示例

Alo*_*ave 10 c++ oop design-patterns

我正在研究模型 - 视图 - 控制器设计模式,我理解这个模式背后的概念,但是我想看一看如何实际将它付诸实践.
维基百科提到了Wt - Web工具包,CppCMS以及其他一些使用该模式的标准实现,但我并不熟悉这些模式,我只是希望并且真的很感激如果有人能够提供一些实现代码的示例代码(希望是C++)模式并解释了实践模式的理论.

rob*_*bev 23

这是我做的一个快速示例(没有尝试编译它,让我知道是否有错误):

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; 
};
Run Code Online (Sandbox Code Playgroud)

忽略Button的实现,基本上这个程序将使用GraphGUI来显示一个图形,当按下按钮时它会改变.让我们说这是一个条形图,它会变得更高.

由于模型独立于视图(按钮),并且控制器处理两者之间的通信,因此遵循MVC模式.

单击该按钮时,控制器通过onButtonClicked函数修改模型,Button类知道该函数在单击时调用.

这样做的好处在于,模型和视图完全独立,每个的实现都可以大幅改变,而且不会影响另一个,控制器可能只需要进行一些更改.如果这种情况下的模型基于一些数据库数据计算了一些结果,那么单击该按钮可能会导致这种情况发生,但按钮实现不必更改.或者,不是在发生咔嗒声时告诉控制器,也许它可以告诉控制器何时按下鼠标.无论触发更改的内容如何,​​都会对模型应用相同的更改.

  • 在 MVC 中,视图通常不知道控制器。通常,控制器会知道模型和视图,并将为视图提供适当的模型实例。正如您所提到的,模型将不知道视图。 (3认同)