Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: adapter pattern, data transformation, unified interface, XML, JSON, GraphQL

Как реализовать паттерн единого коннектора для приёма данных в разных форматах (XML, JSON, GraphQL)?

Вопрос проверяет понимание паттерна единого коннектора для унификации приёма данных из разных источников и форматов.

Короткий ответ

Паттерн единого коннектора реализуется через абстрактный интерфейс, который определяет методы для получения данных. Для каждого формата (XML, JSON, GraphQL) создаётся свой адаптер, реализующий этот интерфейс. Внутри адаптера происходит преобразование данных в единый внутренний формат. Это позволяет клиентскому коду работать с любым источником данных одинаково, не заботясь о деталях парсинга.

Длинный ответ

Концепция единого коннектора

Паттерн единого коннектора (Unified Connector) решает проблему интеграции с различными источниками данных, которые могут предоставлять информацию в разных форматах (XML, JSON, GraphQL). Основная идея — создать абстрактный интерфейс, который скрывает детали реализации каждого формата и предоставляет единый способ получения данных.

Реализация через адаптеры

Для каждого формата создаётся отдельный класс-адаптер, реализующий общий интерфейс. Адаптер отвечает за подключение к источнику, парсинг данных и преобразование их в единый внутренний формат (например, объект JavaScript).

// Единый интерфейс коннектора
class DataConnector {
  async fetchData(query) {
    throw new Error('Must implement fetchData');
  }
}

// Адаптер для JSON
class JSONConnector extends DataConnector {
  constructor(url) {
    super();
    this.url = url;
  }
  async fetchData(query) {
    const response = await fetch(this.url);
    const data = await response.json();
    return this.transform(data);
  }
  transform(data) {
    // Преобразование в единый формат
    return { items: data.results };
  }
}

// Адаптер для XML
class XMLConnector extends DataConnector {
  constructor(url) {
    super();
    this.url = url;
  }
  async fetchData(query) {
    const response = await fetch(this.url);
    const text = await response.text();
    const parser = new DOMParser();
    const xmlDoc = parser.parseFromString(text, 'text/xml');
    return this.transform(xmlDoc);
  }
  transform(xmlDoc) {
    // Преобразование XML в единый формат
    const items = Array.from(xmlDoc.querySelectorAll('item')).map(el => ({
      id: el.querySelector('id').textContent,
      name: el.querySelector('name').textContent
    }));
    return { items };
  }
}

// Адаптер для GraphQL
class GraphQLConnector extends DataConnector {
  constructor(endpoint) {
    super();
    this.endpoint = endpoint;
  }
  async fetchData(query) {
    const response = await fetch(this.endpoint, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ query })
    });
    const result = await response.json();
    return this.transform(result);
  }
  transform(data) {
    // Преобразование GraphQL ответа в единый формат
    return { items: data.data.items };
  }
}

Применение паттерна

Клиентский код использует единый интерфейс, не зная, какой конкретный коннектор используется. Это упрощает добавление новых форматов и делает систему гибкой.

async function processData(connector) {
  const data = await connector.fetchData('{ items { id name } }');
  console.log(data.items);
}

const jsonConnector = new JSONConnector('https://api.example.com/data');
const xmlConnector = new XMLConnector('https://api.example.com/data.xml');
const graphqlConnector = new GraphQLConnector('https://api.example.com/graphql');

processData(jsonConnector);
processData(xmlConnector);
processData(graphqlConnector);

Вывод

Паттерн единого коннектора стоит применять в системах, где необходимо интегрироваться с множеством разнородных источников данных. Он обеспечивает единообразие кода, упрощает поддержку и расширение функциональности, а также снижает связанность между компонентами.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#adapter pattern

#data transformation

#unified interface

#XML

#JSON

#GraphQL

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.