Шаблон проектирования метода шаблона в Java

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

Шаблонный метод – шаблон проектирования

Шаблонный метод определяет шаги выполнения алгоритма и может предоставлять реализацию по умолчанию, которая может быть общей для всех или некоторых подклассов. Давайте поймем этот шаблон на примере. Предположим, мы хотим предоставить алгоритм построения дома. Шаги, которые нужно выполнить для построения дома, – строительство фундамента, возведение столбов, постройка стен и окон. Важный момент заключается в том, что мы не можем изменить порядок выполнения, потому что нельзя построить окна перед возведением фундамента. Таким образом, в этом случае мы можем создать шаблонный метод, который будет использовать различные методы для построения дома. Теперь строительство фундамента для дома одинаково для всех типов домов, будь то деревянный дом или стеклянный дом. Поэтому мы можем предоставить базовую реализацию для этого. Если подклассы хотят переопределить этот метод, они могут, но в большинстве случаев это общее правило для всех типов домов. Чтобы убедиться, что подклассы не могут переопределить шаблонный метод, мы должны сделать его финальным.

Абстрактный класс шаблонного метода

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

package com.journaldev.design.template;

public abstract class HouseTemplate {

	//метод-шаблон, финальный, чтобы подклассы не могли переопределить
	public final void buildHouse(){
		buildFoundation();
		buildPillars();
		buildWalls();
		buildWindows();
		System.out.println("House is built.");
	}

	//реализация по умолчанию
	private void buildWindows() {
		System.out.println("Building Glass Windows");
	}

	//методы, которые должны быть реализованы подклассами
	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

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

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");
	}

}

Клиент шаблона метода

Давайте протестируем наш пример шаблона метода с помощью тестовой программы. HousingClient.java

package com.journaldev.design.template;

public class HousingClient {

	public static void main(String[] args) {
		
		HouseTemplate houseType = new WoodenHouse();
		
		//использование метода-шаблона
		houseType.buildHouse();
		System.out.println("************");
		
		houseType = new GlassHouse();
		
		houseType.buildHouse();
	}

}

Обратите внимание, что клиент вызывает метод шаблона базового класса и в зависимости от реализации различных шагов он использует некоторые методы из базового класса и некоторые из подкласса. Вывод вышеуказанной программы:

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.

Диаграмма класса Шаблонного Метода

Шаблонный Метод Паттерн Дизайна в JDK

  • Все наборные методы java.io.InputStream, java.io.OutputStream, java.io.Reader и java.io.Writer.
  • Все наборные методы java.util.AbstractList, java.util.AbstractSet и java.util.AbstractMap.

Важные моменты шаблонного метода паттерна дизайна

  1. Метод шаблона должен состоять из определенных шагов, порядок которых фиксирован, и для некоторых методов реализация отличается от базового класса к подклассу. Метод шаблона должен быть финальным.
  2. Большинство времени подклассы вызывают методы суперкласса, но в шаблонном шаблоне метода метод шаблона суперкласса вызывает методы подклассов, это известно как Принцип Голливуда – “не звоните нам, мы вам позвоним”.
  3. Методы в базовом классе с методом по умолчанию называются Хуки, и они предназначены для переопределения подклассами. Если вы хотите, чтобы некоторые методы не были переопределены, вы можете сделать их окончательными, например, в нашем случае мы можем сделать метод buildFoundation() окончательным, потому что, если мы не хотим, чтобы подклассы его переопределяли.

Это все, что касается шаблона проектирования метода в Java, надеюсь, вам понравилось.

Source:
https://www.digitalocean.com/community/tutorials/template-method-design-pattern-in-java