Шаблонный метод является поведенческим шаблоном проектирования и используется для создания заглушки метода и переноса некоторых этапов реализации на подклассы. Шаблонный метод определяет шаги для выполнения алгоритма и может обеспечить реализацию по умолчанию, которая может быть общей для всех или некоторых подклассов.
Давайте разберем эту модель на примере, предположим, что мы хотим предоставить алгоритм для строительства дома. Шаги должны быть выполнены, чтобы построить дом — фундамент здания, столбы здания, стены здания и окна. Важным моментом является то, что мы не можем изменить порядок выполнения, потому что мы не можем строить окна до создания фундамента. Таким образом, в этом случае мы можем создать шаблонный метод, который будет использовать различные методы для строительства дома.
Теперь строительство фундамента для дома одинаково для всех типов домов, будь то деревянный дом или стеклянный дом. Таким образом, мы можем предоставить базовую реализацию для этого, если подклассы хотят переопределить этот метод, они могут, но в основном это характерно для всех типов домов.
Чтобы убедиться, что подклассы не переопределяют метод шаблона, мы должны сделать его финальным.
Шаблонный метод Абстрактный класс
Поскольку мы хотим, чтобы некоторые методы были реализованы подклассами, мы должны сделать наш базовый класс абстрактным .
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 | packagecom.journaldev.design.template;publicabstractclassHouseTemplate {    //template method, final so subclasses can't override    publicfinalvoidbuildHouse(){        buildFoundation();        buildPillars();        buildWalls();        buildWindows();        System.out.println("House is built.");    }    //default implementation    privatevoidbuildWindows() {        System.out.println("Building Glass Windows");    }    //methods to be implemented by subclasses    publicabstractvoidbuildWalls();    publicabstractvoidbuildPillars();    privatevoidbuildFoundation() {        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 | packagecom.journaldev.design.template;publicclassWoodenHouse extendsHouseTemplate {    @Override    publicvoidbuildWalls() {        System.out.println("Building Wooden Walls");    }    @Override    publicvoidbuildPillars() {        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 | packagecom.journaldev.design.template;publicclassGlassHouse extendsHouseTemplate {    @Override    publicvoidbuildWalls() {        System.out.println("Building Glass Walls");    }    @Override    publicvoidbuildPillars() {        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 | packagecom.journaldev.design.template;publicclassHousingClient {    publicstaticvoidmain(String[] args) {        HouseTemplate houseType = newWoodenHouse();        //using template method        houseType.buildHouse();        System.out.println("************");        houseType = newGlassHouse();        houseType.buildHouse();    }} | 
Обратите внимание, что клиент вызывает метод шаблона базового класса и, в зависимости от реализации различных шагов, использует некоторые методы из базового класса, а некоторые из подкласса.
Вывод вышеуказанной программы:
| 01 02 03 04 05 06 07 08 09 10 11 | Building foundation with cement,iron rods and sandBuilding Pillars with Wood coatingBuilding Wooden WallsBuilding Glass WindowsHouse is built.************Building foundation with cement,iron rods and sandBuilding Pillars with glass coatingBuilding Glass WallsBuilding Glass WindowsHouse 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, надеюсь, вам понравилось.
