Страница 1 из 1

MVC (Model-View-Controller)

Добавлено: 16 авг 2024, 12:52
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

Re: MVC (Model-View-Controller)

Добавлено: 16 авг 2024, 16:25
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;
}