Внедряване на шаблона на шаблонен метод в Java

1. Общ преглед

В този бърз урок ще видим как да използваме шаблона на метода на шаблона - един от най-популярните GoF модели.

Това улеснява прилагането на сложни алгоритми чрез капсулиране на логиката в един метод.

2. Прилагане

За да демонстрираме как работи шаблонният метод, нека създадем прост пример, който представлява изграждането на компютърна станция.

Предвид определяне на схемата на, структура алгоритъма ще бъдат определени в базов клас, който определя шаблон строителство () метод :

public abstract class ComputerBuilder { // ... public final Computer buildComputer() { addMotherboard(); setupMotherboard(); addProcessor(); return new Computer(computerParts); } public abstract void addMotherboard(); public abstract void setupMotherboard(); public abstract void addProcessor(); // ... }

Класът ComputerBuilder е отговорен за очертаването на стъпките, необходими за изграждане на компютър, чрез деклариране на методи за добавяне и настройка на различни компоненти , като дънна платка и процесор.

Тук, на натрупване () е методът на шаблон , който определя стъпки на алгоритъма за сглобяване на компютърни части и се връща напълно инициализират Компютърни случаи.

Забележете, че i t е обявено за окончателно, за да се предотврати замяната му.

3. В действие

С вече зададения основен клас, нека се опитаме да го използваме, като създадем два подкласа. Единият, който изгражда „стандартен“ компютър, а другият, който изгражда „висок клас“ компютър:

public class StandardComputerBuilder extends ComputerBuilder { @Override public void addMotherboard() { computerParts.put("Motherboard", "Standard Motherboard"); } @Override public void setupMotherboard() { motherboardSetupStatus.add( "Screwing the standard motherboard to the case."); motherboardSetupStatus.add( "Pluging in the power supply connectors."); motherboardSetupStatus.forEach( step -> System.out.println(step)); } @Override public void addProcessor() { computerParts.put("Processor", "Standard Processor"); } }

И ето вариантът HighEndComputerBuilder :

public class HighEndComputerBuilder extends ComputerBuilder { @Override public void addMotherboard() { computerParts.put("Motherboard", "High-end Motherboard"); } @Override public void setupMotherboard() { motherboardSetupStatus.add( "Screwing the high-end motherboard to the case."); motherboardSetupStatus.add( "Pluging in the power supply connectors."); motherboardSetupStatus.forEach( step -> System.out.println(step)); } @Override public void addProcessor() { computerParts.put("Processor", "High-end Processor"); } }

Както виждаме, не трябваше да се притесняваме за целия процес на сглобяване, а само за предоставяне на реализации за отделни методи.

Сега нека го видим в действие:

new StandardComputerBuilder() .buildComputer(); .getComputerParts() .forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v)); new HighEndComputerBuilder() .buildComputer(); .getComputerParts() .forEach((k, v) -> System.out.println("Part : " + k + " Value : " + v));

4. Шаблонни методи в Java Core Libraries

Този модел се използва широко в основните библиотеки на Java, например от java.util.AbstractList или java.util.AbstractSet.

Например, Abstract List предоставя скелетна реализация на интерфейса на List .

Пример за метод на шаблон може да бъде методът addAll () , въпреки че не е изрично дефиниран като окончателен:

public boolean addAll(int index, Collection c) { rangeCheckForAdd(index); boolean modified = false; for (E e : c) { add(index++, e); modified = true; } return modified; }

Потребителите трябва само да приложат метода add () :

public void add(int index, E element) { throw new UnsupportedOperationException(); }

Тук отговорността на програмиста е да осигури изпълнение за добавяне на елемент към списъка в дадения индекс (вариантната част на алгоритъма за списъци).

5. Заключение

В тази статия показахме шаблона на метода на шаблона и как да го приложим в Java.

Шаблонът на метода на шаблона насърчава повторното използване и отделяне на кода, но за сметка на използването на наследство.

Както винаги, всички примерни кодове, показани в тази статия, са достъпни в GitHub.