В нашей предыдущей статье мы описали шаблон проектирования адаптера . В сегодняшней статье мы собираемся показать еще одну такую Банду Четырех Структурных паттернов . Как следует из названия, структурный шаблон используется для формирования более крупной объектной структуры из множества различных объектов. Шаблон фасада является одним из таких шаблонов, который обеспечивает упрощенный интерфейс для набора интерфейсов в системе и, таким образом, скрывает сложности подсистемы от клиента.
Когда использовать шаблон фасада?
Слои: Шаблон фасада можно использовать в приложениях JEE для создания слоя, который абстрагирует и объединяет связанные интерфейсы в приложении. Использование фасада определит точку входа на каждый уровень подсистемы и, таким образом, заставит их общаться только через их фасады; это может упростить зависимости между ними.
Фасад облегчает использование API и библиотек, что хорошо для обслуживания и удобочитаемости. Он также может сопоставлять и абстрагировать различные плохо разработанные API с помощью одного упрощенного API.
Это также уменьшает зависимости внешнего кода от внутренней работы библиотек и, таким образом, обеспечивает гибкость.
В приведенной выше структуре для шаблона Façade класс Façade изолирует подсистему от клиента. Клиент взаимодействует только с классом Façade, не зная о классах подсистем.
Пример:
Давайте рассмотрим пример обработки заказа на сайте. Клиент разместил заказ, не зная, как работают внутренние классы. После размещения заказа слой класса фасада вызывает методы подсистем, такие как Inventory для проверки запасов и Payment для обработки оплаты. После обработки он возвращает управление клиентскому классу с подтверждением об обработке заказа.
Схема последовательности:
Пример кода:
Inventory.java —
1
2
3
4
5
|
public class Inventory { public String checkInventory(String OrderId) { return 'Inventory checked' ; } } |
Payment.java
1
2
3
4
5
6
|
public class Payment { public String deductPayment(String orderID) { return 'Payment deducted successfully' ; } } |
OrderFacade.java
01
02
03
04
05
06
07
08
09
10
11
12
|
public class OrderFacade { private Payment pymt = new Payment(); private Inventory inventry = new Inventory(); public void placeOrder(String orderId) { String step1 = inventry.checkInventory(orderId); String step2 = pymt.deductPayment(orderId); System.out .println( 'Following steps completed:' + step1 + ' & ' + step2); } } |
Client.java
1
2
3
4
5
6
7
|
public class Client { public static void main(String args[]){ OrderFacade orderFacade = new OrderFacade(); orderFacade.placeOrder( 'OR123456' ); System.out.println( 'Order processing completed' ); } } |
Выгоды:
- Мы можем использовать шаблон фасада, чтобы сопоставить все сложные вызовы методов и связанные кодовые блоки и направить его в один класс Façade. Таким образом, по отношению к клиенту существует только один вызов. Даже если мы внесем изменения в пакеты / класс подсистемы и их логику, это не повлияет на вызов клиента. Короче это увеличивает слабую связь.
- Это облегчает использование и поддержку создания более структурированной среды и уменьшает зависимости между библиотеками или другими пакетами.
Недостатки / Последствия:
- Одним из недостатков является то, что методы подсистемы связаны со слоем Фасад. Если структура подсистемы изменится, это потребует последующего изменения уровня Façade и методов клиента.
Интересные моменты:
Шаблон фасада может быть перепутан с шаблоном посредника. Посредник также абстрагирует функциональность подсистемы аналогично фасаду. Однако между этими двумя паттернами существует тонкая разница. В случае паттерна «Посредник» подсистема знает о посреднике, однако в случае «Фасада» подсистема ничего не знает о фасаде. Это односторонняя связь от фасада к подсистеме.
Фасад используется в Java API
- javax.servlet.http.HttpSession
- javax.servlet.http.HttpServletRequest
- javax.servlet.http.HttpServletResponse
- javax.faces.context.ExternalContext
Ссылка: Шаблон дизайна фасада — точка зрения дизайна от нашего партнера JCG Майнака Госвами в блоге Idiotechie .