Патерн проектирования Фасад в Dart/Flutter

Определение в википедии

Шаблон фасад (англ. Facade) — структурный шаблон проектирования, позволяющий скрыть сложность системы путём сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.

Шаблон проектирования - Фасад

Шаблон проектирования — Фасад

«Приёмы объектно-ориентированного проектирования. Па́ттерны проектирования» (англ. Design Patterns: Elements of Reusable Object-Oriented Software) — книга 1994 года о программной инженерии, описывающая шаблоны проектирования программного обеспечения. Авторами книги, которых прозвали «Бандой четырёх», являются Эрих Гамма,  Ричард Хелм,  Ральф Джонсон  (англ.)рус.,  Джон Влиссидес. 

Теперь мы знаем официальные определение паттерна Фасад и давайте реализуем его на языке Dart.

Создаём класс с конструктором для наших данных, называться он будет Plane

class Plane {
  final String model;
  final int numberOfPassangers;
  final bool isCommerce;

  const Plane({
    required this.model,
    required this.numberOfPassangers,
    required this.isCommerce,
  });
}

Потом создаём необходимые интерфейсы. У нас будет 2 интерфейса и по 2 метода в каждом.

interface class IGetPlane {
  void getListPlane() {}
  void saveToFile() {}
}
interface class IExport {
  void exportToExel() {}
  void exportToWord() {}
}

Теперь создаём реализацию наших интерфейсов.

class ExportImpl implements IExport {
  final Plane plane;
  const ExportImpl({required this.plane});

  @override
  void exportToExel() {
    print('Экспорт в Эксель ${plane.model}');
  }

  @override
  void exportToWord() {
    print('Экспорт в Ворд');
  }
}

Не будем нагружать код реальными методами, а просто будем выводить что то в консоль.

class GetPlaneImpl implements IGetPlane {
  @override
  void getListPlane() {
    print('получить список самолетов');
  }

  @override
  void saveToFile() {
    print('Сохранение в файл');
  }
}

А теперь мы создадим класс Facade, в который мы прокинем данные для наших методов и сделаем инстансы наших классов (ExportImpl и GetPlaneImpl) и сделаем единственный метод run, который будет запускать методы в наших 2х дочерних класса.

class Facade {
  final Plane plane;
  Facade(this.plane);

  late ExportImpl export = ExportImpl(plane: plane);
  final getPLANE = GetPlaneImpl();

  void run() {
    print(plane.model);
    getPLANE.getListPlane();
    export.exportToExel();
  }
}

Давайте теперь перейдём в main. Создаём наш самолёт с необходимыми данными. Делаем инстанс класса Фасад и вызываем метод run, который объединил в себе вызов внутренних методов других классов.

void main() {
  Plane plane = const Plane(
    model: 'Cesna 172',
    numberOfPassangers: 4,
    isCommerce: false,
  );

  Facade(plane).run();
}

Давайте запустим и посмотрим, что из этого выйдет!

Вывод в консоль

Вывод в консоль

Ну что же поздравляю, всё работает! Итак, мы с помощью языка Dart разобрали как организовать паттерн Фасад.

© Habrahabr.ru