Template Method Pattern là một mẫu thiết kế thuộc nhóm behavioral design pattern (mẫu thiết kế hành vi). Mẫu thiết kế này được dùng để tạo một phương thức khung (method stub) và hoãn việc hiện thực một số bước cụ thể cho các lớp con.
1. Khái niệm mẫu thiết kế Template Method trong Java
Template Method định nghĩa các bước để thực hiện một thuật toán và có thể cung cấp các phần triển khai mặc định. Những phần này thường giống nhau cho tất cả hoặc một số lớp con.
Ví dụ: Giả sử ta muốn đưa ra một thuật toán xây nhà. Các bước gồm:
- Xây móng
- Xây cột
- Xây tường
- Lắp cửa sổ
Thứ tự các bước không thể thay đổi (không thể lắp cửa sổ trước khi xây móng).
Vì vậy, ta có thể tạo một phương thức template gọi lần lượt các bước này.
Ví dụ, việc xây móng có thể giống nhau cho mọi loại nhà (nhà gỗ, nhà kính…), Vì vậy, chúng ta có thể cung cấp phần triển khai mặc định cho bước này. Nếu lớp con muốn, vẫn có thể ghi đè (override), nhưng thường sẽ giữ nguyên.
Để chắc chắn lớp con không ghi đè phương thức template, ta nên khai báo nó là final.
2. Lớp trừu tượng Template Method
Vì chúng ta muốn một số phương thức được cài đặt bởi các lớp con, nên lớp cơ sở của chúng ta phải là một lớp trừu tượng.
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");
}
}
Phương thức buildHouse() là template method, thường dùng để định nghĩa thứ tự thực thi các bước.
Các lớp cụ thể (Concrete Classes) của Template Method
Chúng ta có thể có nhiều loại nhà khác nhau, chẳng hạn như nhà gỗ và nhà kính.
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");
}
}
Chúng ta có thể ghi đè các phương thức khác, nhưng để đơn giản, ở đây không làm vậy.
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");
}
}
Chương trình kiểm thử (Client)
Hãy kiểm tra ví dụ về Template Method pattern với một chương trình test.
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();
}
}
Chú ý rằng client gọi phương thức template từ lớp cha, và tùy vào cách cài đặt các bước, nó sẽ sử dụng một số phương thức từ lớp cha và một số từ lớp con.
Kết quả chương trình:
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.
Sơ đồ lớp Template Method

Template Method pattern trong JDK
- Tất cả các phương thức không trừu tượng của
java.io.InputStream,java.io.OutputStream,java.io.Readervàjava.io.Writer. - Tất cả các phương thức không trừu tượng của
java.util.AbstractList,java.util.AbstractSetvàjava.util.AbstractMap.
Những điểm quan trọng của Template Method Pattern
- Template Method nên bao gồm một số bước có thứ tự cố định; với một số phương thức, phần cài đặt sẽ khác nhau giữa lớp cha và lớp con. Template Method nên được khai báo
final. - Thông thường, lớp con gọi các phương thức của lớp cha; nhưng trong Template Pattern, phương thức template của lớp cha lại gọi các phương thức từ lớp con. Điều này được gọi là Nguyên tắc Hollywood – “Đừng gọi cho chúng tôi, chúng tôi sẽ gọi cho bạn”.
- Các phương thức trong lớp cha có cài đặt mặc định được gọi là Hook. Chúng được thiết kế để lớp con ghi đè nếu cần. Nếu muốn một số phương thức không bị ghi đè, bạn có thể đặt chúng là
final. Ví dụ, trong trường hợp này, ta có thể đặtbuildFoundation()làfinalnếu không muốn lớp con thay đổi nó.
Đó là tất cả về Mẫu Thiết kế Template Method trong Java. Hy vọng bạn thấy nó hữu ích!