Поиск по сайту:

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


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

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

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

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

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

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() является шаблонным методом и определяет порядок выполнения для выполнения нескольких шагов.

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

У нас могут быть разные типы домов, такие как деревянный дом и стеклянный дом. Деревянный дом.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();
		
		//using template method
		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() final, потому что если мы не хотим, чтобы подклассы переопределяли его.

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