MVC (Model-View-Controller)

Ответить
ya
^-^
Сообщения: 2534
Зарегистрирован: 16 дек 2021, 19:56

MVC (Model-View-Controller)

Сообщение ya »

MVC (Model-View-Controller) — это шаблон проектирования, который используется для организации кода в приложениях. Он разделяет приложение на три основных компонента:

Model (Модель): отвечает за управление данными, бизнес-логикой и правилами приложения. Она взаимодействует с базой данных и выполняет операции над данными.

View (Представление): отображает данные из модели пользователю и определяет, как информация будет представлена. Она отвечает за интерфейс пользователя.

Controller (Контроллер): обрабатывает ввод пользователя, взаимодействует с моделью и обновляет представление. Контроллер получает запросы от представления и реагирует на них, изменяя модель и состояние представления.

Код: Выделить всё

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

// Модель
class Model {
public:
    void addItem(const std::string& item) {
        items.push_back(item);
    }

    const std::vector<std::string>& getItems() const {
        return items;
    }

    void setItems(const std::vector<std::string>& newItems) {
        items = newItems;
    }

private:
    std::vector<std::string> items;
};

// Представление
class View {
public:
    void displayItems(const std::vector<std::string>& items) const {
        std::cout << "Items in the list:\n";
        for (const auto& item : items) {
            std::cout << " - " << item << "\n";
        }
    }

    void promptForItem() const {
        std::cout << "Enter a new item: ";
    }
};

// Контроллер
class Controller {
public:
    Controller(Model& model, const View& view)
        : model(model), view(view) {}

    void addItem(const std::string& item) {
        model.addItem(item);
    }

    void displayItems() const {
        view.displayItems(model.getItems());
    }

    void promptForAndAddItem() {
        view.promptForItem();
        std::string item;
        std::getline(std::cin, item);
        addItem(item);
    }

private:
    Model& model;
    const View& view;
};

int main() {
    Model model;
    View view;
    Controller controller(model, view);

    std::string command;
    while (true) {
        std::cout << "Command (add/show/exit): ";
        std::getline(std::cin, command);

        if (command == "add") {
            controller.promptForAndAddItem();
        } else if (command == "show") {
            controller.displayItems();
        } else if (command == "exit") {
            break;
        } else {
            std::cout << "Unknown command!\n";
        }
    }

    return 0;
}
Model: здесь он управляет списком элементов, предоставляя методы для добавления новых элементов и получения текущих.

View: отвечает за отображение списка элементов и запрашивает ввод от пользователя.

Controller: связывает модель и представление, обрабатывает команды пользователя.

Код: Выделить всё

g++ -std=c++11 -o mvc_example mvc_example.cpp
ya
^-^
Сообщения: 2534
Зарегистрирован: 16 дек 2021, 19:56

Re: MVC (Model-View-Controller)

Сообщение ya »

Определение базовых классов

Код: Выделить всё

class Model {
public:
    virtual void setData(int data) = 0;
    virtual int getData() const = 0;
    virtual ~Model() = default;
};

class View {
public:
    virtual void display(int data) = 0;
    virtual ~View() = default;
};

class Controller {
public:
    virtual void updateModel(int data) = 0;
    virtual void updateView() = 0;
    virtual ~Controller() = default;
};
Реализация конкретных классов

Код: Выделить всё

class SimpleModel : public Model {
private:
    int data;

public:
    void setData(int newData) override {
        data = newData;
    }

    int getData() const override {
        return data;
    }
};

class SimpleView : public View {
public:
    void display(int data) override {
        std::cout << "Data: " << data << std::endl;
    }
};

class SimpleController : public Controller {
private:
    Model* model;
    View* view;

public:
    SimpleController(Model* m, View* v) : model(m), view(v) {}

    void updateModel(int data) override {
        model->setData(data);
    }

    void updateView() override {
        view->display(model->getData());
    }
};
Добавление функций к шаблону MVC

Код: Выделить всё

class Event {
public:
    virtual void notify(int data) = 0; // Метод для обработки события
    virtual ~Event() = default;
};

class ModelObserver : public Event {
private:
    Controller* controller;

public:
    ModelObserver(Controller* c) : controller(c) {}

    void notify(int data) override {
        controller->updateView(); // Обновление представления при изменении данных в модели
    }
};

Основная функция

Код: Выделить всё

int main() {
    SimpleModel model;
    SimpleView view;
    SimpleController controller(&model, &view);
    ModelObserver observer(&controller);

    // Пример обновления данных в модели и отображения во вью
    controller.updateModel(42);
    observer.notify(model.getData()); // Вызываем оповещение об изменении модели

    return 0;
}

ya
^-^
Сообщения: 2534
Зарегистрирован: 16 дек 2021, 19:56

Re: MVC (Model-View-Controller)

Сообщение ya »

Модель: Представляет данные и логику приложения.
Вид: Представляет собой элементы пользовательского интерфейса, которые отображают данные.
Контроллер: обрабатывает пользовательский ввод и взаимодействует с моделью для обновления представления.

Пример реализации
Вот простой пример того, как можно реализовать паттерн MVC на C++11:

Model

Код: Выделить всё

#include <string>

class Model {
private:
    std::string data;
public:
    void setData(const std::string& newData) {
        data = newData;
    }
    std::string getData() const {
        return data;
    }
};
View

Код: Выделить всё

#include <iostream>

class View {
public:
    void displayData(const std::string& data) {
        std::cout << "Data: " << data << std::endl;
    }
};
Controller

Код: Выделить всё

class Controller {
private:
    Model& model;
    View& view;
public:
    Controller(Model& m, View& v) : model(m), view(v) {}
    void updateData(const std::string& newData) {
        model.setData(newData);
        view.displayData(model.getData());
    }
};
сборка

Код: Выделить всё

g++ -std=c++11 -o mvc_example mvc_example.cpp
Статья GeeksforGeeks о паттерне проектирования MVC содержит подробное объяснение и примеры паттерна MVC.
Статья Medium о MVC в C++ предлагает понимание реализации MVC в C++.
Этот пример должен дать вам прочную основу для начала реализации паттерна MVC в ваших проектах на C++.

https://jacobgalam.medium.com/mvc-in-c-66497e5d7011
https://www.geeksforgeeks.org/mvc-design-pattern/
https://stackoverflow.com/questions/3984296/model-view-controller-design-pattern-code-example
https://www.modernescpp.com/index.php/model-view-controller/
https://softwareengineering.stackexchange.com/questions/426791/how-to-do-mvc-in-c
https://www.youtube.com/watch?v=GwQnoaUoiOM
https://www.geeksforgeeks.org/observer-pattern-c-design-patterns/
ya
^-^
Сообщения: 2534
Зарегистрирован: 16 дек 2021, 19:56

Re: MVC (Model-View-Controller)

Сообщение ya »

Современные паттерны проектирования C++ Полный курс
https://www.youtube.com/watch?v=GwQnoaUoiOM

Этот курс предназначен для разработчиков на C++, которые хотят улучшить свои навыки, изучив такие ключевые понятия, как паттерны проектирования, идиомы и функциональное программирование. В курсе рассматриваются традиционные методы C++, такие как ручное управление памятью, а также новейшие возможности C++ 11 и C++ 14. К концу курса вы сможете применить свои новые знания для реализации общих паттернов и идиом, а также функциональных операций.

переведено и озвучено ИИ

Ответить