Template Method Pattern là gì
- Phân loại: Behavior Pattern
- Mục đích: Template Method xây dựng một bộ khung thuật toán trong một toán tử, để lại việc định nghĩa một vài bước cho các subclass mà không làm thay đổi cấu trúc chung của thuật toán.
- Tần suất sử dụng: trung bình
Template Method Pattern được sử dụng khá nhiều trong mô hình Abstract – Concrete Class. Khi chúng ta muốn các Concrete class tự thực thi xử lí theo cách của nó, nhưng đồng thời vẫn đảm bảo tuận theo những ràng buộc nhất định từ Abstract class. Ví dụ như ràng buộc về thứ tự các bước thực hiện, hay ràng buộc về dữ liệu đầu vào, đầu ra, …
Cài đặt Template Method Pattern
AbstractClass khai báo các phương thức hoạt động như các bước của một thuật toán, cũng như template method thực tế gọi các phương thức này theo một thứ tự cụ thể. Các bước có thể được khai báo là trừu tượng hoặc có một số triển khai mặc định.
abstract class Beverage {
// Phương thức mẫu định nghĩa bộ khung thuật toán
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
// Các phương thức cơ bản mà các lớp con phải cài đặt
abstract void brew(); // Lớp con sẽ cài đặt cách pha chế
abstract void addCondiments(); // Lớp con sẽ cài đặt cách thêm gia vị (nếu có)
// Các bước chung không cần thay đổi
private void boilWater() {
System.out.println("Boiling water");
}
private void pourInCup() {
System.out.println("Pouring into cup");
}
}
ConcreteClass : là một thuật toán cụ thể, cài đặt các phương thức của AbstractClass. Các thuật toán này ghi đè lên các phương thức trừu tượng để cung cấp các triển khai thực sự. Nó không thể ghi đè phương thức duy nhất đã được cài đặt ở AbstractClass (templateMethod).
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("Dripping coffee through filter");
}
@Override
void addCondiments() {
System.out.println("Adding sugar and milk");
}
}
public class Main {
public static void main(String[] args) {
Beverage tea = new Tea();
Beverage coffee = new Coffee();
System.out.println("\nMaking tea...");
tea.prepareRecipe(); // Gọi phương thức mẫu, các bước pha trà
System.out.println("\nMaking coffee...");
coffee.prepareRecipe(); // Gọi phương thức mẫu, các bước pha cà phê
}
}
Ưu & nhược điểm
Ưu điểm
- Tái sử dụng code (reuse), tránh trùng lặp code (duplicate): đưa những phần trùng lặp vào lớp cha (abstract class).
- Cho phép người dùng override chỉ một số phần nhất định của thuật toán lớn, làm cho chúng ít bị ảnh hưởng hơn bởi những thay đổi xảy ra với các phần khác của thuật toán.
Nhược điểm
- Template method có càng nhiều bước để override càng khó bảo trì.
Nguồn tham khảo
https://viblo.asia/p/template-method-design-pattern-tro-thu-dac-luc-cua-developers-Az45bqYLlxY