/* * iquiz_adapter.h — Целевой интерфейс (Target) паттерна «Адаптер» * * ╔══════════════════════════════════════════════════════════════════╗ * ║ ПАТТЕРН «АДАПТЕР» (Adapter / Wrapper) ║ * ╠══════════════════════════════════════════════════════════════════╣ * ║ Задача: клиентский код (ApiClient) хочет работать с Quiz- ║ * ║ объектами, но получает от сети «чужой» формат — QJsonObject. ║ * ║ ║ * ║ Участники: ║ * ║ • Target (цель) — IQuizAdapter ← этот файл ║ * ║ • Adaptee (адаптируемый) — QJsonObject / QJsonArray (Qt) ║ * ║ • Adapter (адаптер) — QuizJsonAdapter ║ * ║ • Client (клиент) — ApiClient, использует IQuizAdapter ║ * ╚══════════════════════════════════════════════════════════════════╝ * * IQuizAdapter задаёт контракт: «дай мне QJson-данные — * я верну тебе Quiz или QList». * ApiClient знает только об этом интерфейсе и не зависит * от конкретного способа парсинга. Если завтра формат сервера * изменится (XML, Protobuf), достаточно написать новый класс, * реализующий IQuizAdapter, — ApiClient трогать не придётся. */ #pragma once #include // { "key": value, ... } — один JSON-объект #include // [ {...}, {...} ] — массив JSON-объектов #include // динамический массив Qt #include "quiz.h" // целевой тип данных нашего приложения class IQuizAdapter { public: /* * Виртуальный деструктор обязателен для любого полиморфного * базового класса: без него при delete через указатель на базу * деструктор производного класса не будет вызван (UB). */ virtual ~IQuizAdapter() = default; /* * Преобразует один JSON-объект в C++-объект Quiz. * Вызывается, когда сервер вернул одну запись * (GET /api/quiz/:id/ → { "id":1, "title":"...", ... }). * * Метод объявлен const: адаптер не хранит состояния — * один и тот же экземпляр можно использовать многократно. * * Метод чисто виртуальный (= 0): IQuizAdapter нельзя * создать напрямую; обязательна конкретная реализация. */ virtual Quiz toQuiz(const QJsonObject &json) const = 0; /* * Преобразует JSON-массив в список Quiz. * Вызывается, когда сервер вернул коллекцию записей * (GET /api/quiz/ → [ {...}, {...}, ... ]). * * Внутри реализации каждый элемент массива * делегируется в toQuiz(). */ virtual QList toQuizList(const QJsonArray &json) const = 0; };