Использование шаблона фасада

Как я могу узнать, что мне нужен шаблон фасада в момент разработки моего приложения?

Как я могу нарисовать линию между Фасадом и Шаблоном?

Например: в этой статье мы видим, что int placeOrder(int CustomerID, List<BasketItem> Products) имеет ряд предопределенных шагов в алгоритме. Так почему же автор не использует шаблон здесь?

3 ответа

Решение

Фасад имеет дело с интерфейсом, а не с реализацией. Его цель - скрыть внутреннюю сложность за единым интерфейсом, который выглядит простым снаружи. В примере из вашего вопроса фасад скрывает четыре класса (Order, OrderLine, Address, BasketItem) за одним методом.

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

Так почему же автор не использует шаблон здесь?

Было бы целесообразно сделать placeOrder шаблонный метод, если было несколько похожих версий операции. Может быть, несколько методов, таких как placePhoneOrder, placeInternetOrder, placeManuallyEnteredOrder может быть преобразован в единый шаблон placeOrder с некоторыми подклассами, реализующими только специфичные для {phone, internet, manual} различия.

Шаблон фасада подходит, если у вас есть сложная система, которую вы хотите предоставить клиентам в упрощенном виде, или вы хотите создать внешний коммуникационный уровень поверх существующей системы, несовместимый с вашей системой. Это структурный паттерн. Смотрите здесь: http://en.wikipedia.org/wiki/Facade_pattern

Шаблонный шаблон, с другой стороны, является поведенческим шаблоном, который поможет вам при работе с внутренней реализацией компонента. Смотрите здесь: http://en.wikipedia.org/wiki/Template_method_pattern

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

ОБНОВЛЕНИЕ: В упомянутой статье метод PlaceOrder имеет одну единственную реализацию, которая работает для всех заказов. Шаблон шаблона предназначен для предписания последовательности шагов, которые необходимо выполнить, но позволяет подклассам предлагать свою реализацию этих фиксированных шагов. Например, если вам нужно, чтобы заказы на телевизоры обрабатывались иначе, чем заказы на микроволновые печи, вы можете использовать шаблон шаблона, чтобы переопределить какой-то мнимый метод DispatchParcel (чтобы отправить микроволновую печь в виде простого пакета, но телевизор с дополнительным обслуживанием, чтобы помочь поднять тяжелое устройство на верхний этаж). В нашем случае нет необходимости повторной реализации шагов ProcessOrder, поэтому нет необходимости в шаблоне шаблона, поскольку одна отдельная реализация подходит для всех типов заказов.

Другие вопросы по тегам