Skip to content

Instantly share code, notes, and snippets.

@YozhEzhi
Created September 4, 2020 20:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save YozhEzhi/c6ba846a6b81d48e6aaa6c1e093296d9 to your computer and use it in GitHub Desktop.
Save YozhEzhi/c6ba846a6b81d48e6aaa6c1e093296d9 to your computer and use it in GitHub Desktop.

Шаблон Фасад

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

Фасад — структурный паттерн. Часто его можно обнаружить в JavaScript-библиотеках и фреймворках, где пользователям доступна только ограниченная абстракция широкого диапазона поведений реализованных внутри.

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

Причина, по которой интересен Фасад — возможность скрыть детали реализации конкретной функциональности, хранящиеся в модулях. Это позволит нам вносить изменения в реализацию, не сообщая об этом пользователям.

Надежный Фасад — позволит переходить с одной библиотеки на другую не меняя слой взаимодействия. Более того, у вас появляется возможность совершить такой переход на более поздних этапах, без изменений в остальных частях системы.

var module = (function() { var _private = { i: 5, get: function() { console.log('Текущее значение:' + this.i); }, set: function(val) { this.i = val; }, run: function() { console.log('процесс запущен'); }, jump: function() { console.log('резкое изменение'); } }; return { facade: function(args) { _private.set(args.val); _private.get(); if (args.run) { _private.run(); } } } }());

module.facade({run:true, val:10});

Фасад, в нашей архитектуре, выполняет роль абстракции ядра приложения. Фасад находится между Медиатором и Модулями. Модули в идеальной ситуации должны взаимодействовать исключительно с Фасадом и не должны знать абсолютно ничего о других компонентах нашей системы.

Все сообщения от Модулей, адресованные Медиатору, проходят через Фасад. Его роль - анализ сообщений, исходящих от Модулей, и передача этих сообщений в Медиатор.

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

Медиатор представляет собой интерпретацию паттерна «подписчик/издатель», но он получает только те сообщения, которые нас действительно интересуют. За фильтрацию же всех сообщений отвечает фасад.

Шаблон Медиатор

Принципиальное различие между Фасадом и Медиатором заключается в том, что Фасад, как структурный паттерн, всего лишь передает существующую функциональность в Медиатор, в то время как Медиатор, как поведенческий паттерн, может эту функциональность расширять.

Аналогия медиатора - диспетчерская вышка в аэропорту. Медиатор выступает в качестве посредника в общении между различными модулями, инкапсулируя их взаимодействие. Также, он позволяет каждому модулю функционировать абсолютно независимо от других компонентов системы, что приводит к большей гибкости.

Обслуживание ошибок должно обрабатываться ядром приложения. В добавок к сообщению об интересных событиях Модули также должны сообщать и о любых ошибках которые произошли в их работе. Ядро должно соответствующим образом реагировать на эти ошибки (к примеру, останавливать модули, перезапускать их и т.д. - помним про GMail чат). Это важно, как часть слабо связанной архитектуры, позволяющей реализовать новый или лучший подход к реализации уведомления пользователя об ошибках без ручного изменения в каждом модуле. Используя механизм для публикации событий и подписки на них в Медиаторе мы сможем достичь этого.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment