Шаблонный метод описывается как «шаблон проектирования поведения, который позволяет вам определять каркас алгоритма и позволяет подклассам переопределять определенные этапы алгоритма без изменения его структуры».
Цель состоит в том, чтобы отделить код, который изменяется от кода, который не изменяется, сохраняя проблемы изолированными для специализированных классов. Такие подклассы реализуют потом все конкретные шаги.
Допустим, мы создаем приложение для мониторинга, и нам нужно отправить электронное письмо менеджерам с отчетом, содержащим количество отработанных часов для каждого сотрудника.
Реализация Report класса довольно проста
class Report
def generate_report!
get_employees_worked_time
format_report
send_to_stakeholders
end
def get_employees_worked_time
# Retrieve this info from the database
end
def format_report
# Generate the HTML with the Report design
end
def send_to_stakeholders
# Call send email service
end
end
Код работает отлично. Но если нам необходимо будет сгенерировать такой же отчет в текстовом формате? Единственная часть, будет меняться - шаг формирования отчета. Именно в таком случае хорошим решением будет применить Шаблонный метод.
Чтобы применить этот шаблон, мы преобразуем Report класс в абстрактный класс, который может быть унаследован от нескольких конкретных классов.
Возвращаясь к нашему коду, единственное необходимое изменение - оставить реализацию метода format_report для дочернего класса
class ReportTemplate
def generate_report!
get_employees_worked_time
format_report
send_to_stakeholders
end
def get_employees_worked_time
# Retrieve this info from the database
end
def format_report
raise NotImplementedError
end
def send_to_stakeholders
# Call send email routine
end
end
И для каждого варианта отчета нам нужно создать конкретный подкласс
class HTMLReport < ReportTemplate
def format_report
# implement the report in HTML format
end
end
Если нам прежде необходимо будет создать новый формат, мы только создадим новый конкретный класс. Таким образом, получаем прекрасный пример принципа открытости/закрытости. Организовав наш код таким образом, мы сможем безопаснее и проще применять любые изменения в будущем.
Если вам нужно изменить только несколько методов или сделать их опциональными, этот шаблон - идеальное решение. Шаблонный класс реализует скелет, а подклассы - детали реализации так, как это необходимо.
0 комментариев
Добавить комментарий