Шаблонный метод является поведенческим шаблоном проектирования и используется для создания заглушки метода и переноса некоторых этапов реализации на подклассы. Шаблонный метод определяет шаги для выполнения алгоритма и может обеспечить реализацию по умолчанию, которая может быть общей для всех или некоторых подклассов.
Давайте разберем эту модель на примере, предположим, что мы хотим предоставить алгоритм для строительства дома. Шаги должны быть выполнены, чтобы построить дом — фундамент здания, столбы здания, стены здания и окна. Важным моментом является то, что мы не можем изменить порядок выполнения, потому что мы не можем строить окна до создания фундамента. Таким образом, в этом случае мы можем создать шаблонный метод, который будет использовать различные методы для строительства дома.
Теперь строительство фундамента для дома одинаково для всех типов домов, будь то деревянный дом или стеклянный дом. Таким образом, мы можем предоставить базовую реализацию для этого, если подклассы хотят переопределить этот метод, они могут, но в основном это характерно для всех типов домов.
Чтобы убедиться, что подклассы не переопределяют метод шаблона, мы должны сделать его финальным.
Шаблонный метод Абстрактный класс
Поскольку мы хотим, чтобы некоторые методы были реализованы подклассами, мы должны сделать наш базовый класс абстрактным .
HouseTemplate.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.journaldev.design.template; public abstract class HouseTemplate { //template method, final so subclasses can't override public final void buildHouse(){ buildFoundation(); buildPillars(); buildWalls(); buildWindows(); System.out.println( "House is built." ); } //default implementation private void buildWindows() { System.out.println( "Building Glass Windows" ); } //methods to be implemented by subclasses public abstract void buildWalls(); public abstract void buildPillars(); private void buildFoundation() { System.out.println( "Building foundation with cement,iron rods and sand" ); } } |
buildHouse () является методом шаблона и определяет порядок выполнения для выполнения нескольких шагов.
Метод шаблона Конкретные классы
У нас могут быть дома различного типа, такие как Деревянный Дом и Стеклянный Дом.
WoodenHouse.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package com.journaldev.design.template; public class WoodenHouse extends HouseTemplate { @Override public void buildWalls() { System.out.println( "Building Wooden Walls" ); } @Override public void buildPillars() { System.out.println( "Building Pillars with Wood coating" ); } } |
Мы могли бы переопределить и другие методы, но для простоты я этого не делаю.
GlassHouse.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
package com.journaldev.design.template; public class GlassHouse extends HouseTemplate { @Override public void buildWalls() { System.out.println( "Building Glass Walls" ); } @Override public void buildPillars() { System.out.println( "Building Pillars with glass coating" ); } } |
Шаблонный метод Pattern Client
Давайте проверим наш пример шаблона метода шаблона с помощью тестовой программы.
HousingClient.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
package com.journaldev.design.template; public class HousingClient { public static void main(String[] args) { HouseTemplate houseType = new WoodenHouse(); //using template method houseType.buildHouse(); System.out.println( "************" ); houseType = new GlassHouse(); houseType.buildHouse(); } } |
Обратите внимание, что клиент вызывает метод шаблона базового класса и, в зависимости от реализации различных шагов, использует некоторые методы из базового класса, а некоторые из подкласса.
Вывод вышеуказанной программы:
01
02
03
04
05
06
07
08
09
10
11
|
Building foundation with cement,iron rods and sand Building Pillars with Wood coating Building Wooden Walls Building Glass Windows House is built. ************ Building foundation with cement,iron rods and sand Building Pillars with glass coating Building Glass Walls Building Glass Windows House is built. |
Схема класса шаблона метода
Шаблонный метод Pattern в JDK
- Все неабстрактные методы java.io.InputStream, java.io.OutputStream, java.io.Reader и java.io.Writer.
- Все неабстрактные методы java.util.AbstractList, java.util.AbstractSet и java.util.AbstractMap.
Важные точки
- Шаблонный метод должен состоять из определенных шагов, порядок которых фиксирован, а для некоторых методов реализация отличается от базового класса к подклассу. Шаблонный метод должен быть окончательным.
- В большинстве случаев подклассы вызывают методы из суперкласса, но в шаблоне шаблонный метод суперкласса вызывает методы из подклассов, это известно как принцип Голливуда — «не звоните нам, мы вам позвоним».
- Методы в базовом классе с реализацией по умолчанию называются хуками, и они предназначены для переопределения подклассами. Если вы хотите, чтобы некоторые методы не переопределялись, вы можете сделать их окончательными, например, в нашем случае мы можем сделать buildFoundation () Метод final, потому что если мы не хотим, чтобы подклассы переопределяли его.
Вот и все для реализации шаблона метода шаблона в Java, надеюсь, вам понравилось.