64 lines
4 KiB
C++
64 lines
4 KiB
C++
/*
|
||
* iquiz_adapter.h — Целевой интерфейс (Target) паттерна «Адаптер»
|
||
*
|
||
* ╔══════════════════════════════════════════════════════════════════╗
|
||
* ║ ПАТТЕРН «АДАПТЕР» (Adapter / Wrapper) ║
|
||
* ╠══════════════════════════════════════════════════════════════════╣
|
||
* ║ Задача: клиентский код (ApiClient) хочет работать с Quiz- ║
|
||
* ║ объектами, но получает от сети «чужой» формат — QJsonObject. ║
|
||
* ║ ║
|
||
* ║ Участники: ║
|
||
* ║ • Target (цель) — IQuizAdapter ← этот файл ║
|
||
* ║ • Adaptee (адаптируемый) — QJsonObject / QJsonArray (Qt) ║
|
||
* ║ • Adapter (адаптер) — QuizJsonAdapter ║
|
||
* ║ • Client (клиент) — ApiClient, использует IQuizAdapter ║
|
||
* ╚══════════════════════════════════════════════════════════════════╝
|
||
*
|
||
* IQuizAdapter задаёт контракт: «дай мне QJson-данные —
|
||
* я верну тебе Quiz или QList<Quiz>».
|
||
* ApiClient знает только об этом интерфейсе и не зависит
|
||
* от конкретного способа парсинга. Если завтра формат сервера
|
||
* изменится (XML, Protobuf), достаточно написать новый класс,
|
||
* реализующий IQuizAdapter, — ApiClient трогать не придётся.
|
||
*/
|
||
|
||
#pragma once
|
||
|
||
#include <QJsonObject> // { "key": value, ... } — один JSON-объект
|
||
#include <QJsonArray> // [ {...}, {...} ] — массив JSON-объектов
|
||
#include <QList> // динамический массив 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<Quiz> toQuizList(const QJsonArray &json) const = 0;
|
||
};
|