Статьи

Шаблонный метод Design Pattern в Java

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

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

Теперь строительство фундамента для дома одинаково для всех типов домов, будь то деревянный дом или стеклянный дом. Таким образом, мы можем предоставить базовую реализацию для этого, если подклассы хотят переопределить этот метод, они могут, но в основном это характерно для всех типов домов.

Чтобы убедиться, что подклассы не переопределяют метод шаблона, мы должны сделать его финальным.

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

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

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, надеюсь, вам понравилось.

Ссылка: Шаблонный метод проектирования Шаблон на Java от нашего партнера JCG Панкаджа Кумара в блоге Developer Recipes .