Паттерны проектирования во фронтенде

↑ 8.2 Архитектура фронтенда и паттерны · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Ожидают не перечисление GoF, а примеры из реального кода: где вы использовали и почему.

Порождающие

ПаттернПример
FactorycreateApiClient(config), фабрика компонентов по типу поля
Singletonэкземпляр HTTP-клиента, стор; осторожно с SSR (общий на процесс)
Builderконструктор запросов, конфигуратор графиков

Структурные

ПаттернПример
Adapterпреобразование DTO бэкенда в модели UI
DecoratorHOC, обёртки над функциями (retry, логирование)
Facadeсервис поверх нескольких API
ProxyProxy во Vue-реактивности, кэширующий клиент
Compositeдерево компонентов, меню, файловое дерево

Поведенческие

ПаттернПример
Observerреактивность, EventTarget, RxJS
Strategyстратегия валидации, сортировки, форматирования
Commandundo/redo, очередь операций
Stateконечные автоматы для UI (XState)
Mediatorшина событий, стор
Iteratorитераторы и генераторы
Chain of Responsibilityinterceptors, middleware роутера

Frontend-специфичные

  • Container/Presentational (умные и глупые компоненты);
  • Repository: скрывает получение и сохранение domain-данных;
  • Provider / Dependency Injection: provide/inject;
  • Store (Flux): единый источник состояния, однонаправленный поток;
  • Renderless component: логика без разметки (slot props, composable);
  • Backend For Frontend;
  • Optimistic UI: показываем результат до подтверждения сервера.

Пример: Strategy

type PriceRule = (base: number) => number
const rules: Record<string, PriceRule> = {
  regular: p => p,
  vip: p => p * 0.9,
  promo: p => p - 100,
}
export const price = (base: number, kind: keyof typeof rules) => rules[kind](base)

Пример: Adapter

export const toUser = (dto: UserDto): User => ({
  id: dto.user_id,
  fullName: `${dto.last_name} ${dto.first_name}`,
  createdAt: new Date(dto.created_at),
})

Как отвечать

Проблема → минимальный код → альтернатива без паттерна → цена паттерна → реальный сценарий.

Вопросы с ответами