Шаблон проектирования Шаблонный метод — Template method

Итак, у нас девятый по счету шаблон из серии Design Patterns.

Шаблонный метод — суть в том, чтобы выносить некоторый шаблонный метод в отдельный класс, а конкретные реализации составных методов оставлять наследникам.

Рассмотрим типичный пример. Вам нужно при каждом нажатии на кнопки ходить на сервер и получать данные. Во-первых, нужно проверить наличие интернета. Во-вторых обработать неудачный случай (которых может быть много на самом деле). Ну и предположим что у вас более менее одинаковые ответы от сервера и нужно отобразить пользователю данные.

Перейдем от слов к коду.

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

Итак, у нас главный метод showData, в нем и происходит вся логика. Если есть соединение то показываем прогресс (для этого передаем интерфейс вспомогательный), после чего определяем получили ли нужные данные или запрос в сеть закончился ошибкой. Если все ок показыаем данные и скрываем прогресс. Если не удалось получить данные, показываем сообщение об ошибке. Если же соединения с интернетом нет, то также отобразим сообщение о том, что нет соединения.

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

Посмотрим на интерфейс помощника

Простенький интерфейс, который мы заимплементим в активити.

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

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

Итак, давайте для покрытия всех возможных случаев создадим 2 наследника от абстрактного класса — класс для избранных треков и например топ 100.

Здесь мы будем имитировать загрузку данных с сервера, поэтому просто захардкодим некоторые данные и будем отображать их с некоей задержкой в 2 секунды.

Рассмотрим второй класс, где просто вернем информацию, что не удалось загрузить.

Здесь все просто, в методе получения данных просто возвращаем false. Будто наш сервер не вернул то, чего мы от него ожидали, а например ошибку.

Теперь, чтобы все это протестировать нам нужен некий экран с 2 кнопками для избранных треков и топ100. Также будем отображать избранные списком.

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

И наконец посмотри на то, как это все работает.

Создаем 2 экземплара наших классов, передаем им интерейс помощника. При нажатии на кнопки просто вызываем у них шаблонный метод. Вся логика и алгоритм остаются инкапсулированными в абстрактном методе.

На выходе имеем такие скриншоты.

Сначала нажимаем на получение избранных треков, видим прогресс. После чего отображаются все треки (при условии наличия интернета).

После чего нажимаем на топ 100 и получаем ошибку.

Теперь выключим интернет и попробуем опять. Получаем ошибку.

Плюсы шаблона — позволяет выносить и инкапсулировать одни и те же повторяющиеся последовательности методов в отдельный класс.

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

Запись опубликована в рубрике Программирование Android, Программирование Java. Добавьте в закладки постоянную ссылку.