Skip to main content

Command Palette

Search for a command to run...

Hướng dẫn Template Method Pattern trong Java

Published
4 min readView as Markdown

1. Giới thiệu Template Method Pattern

Template Method Pattern là một mẫu thiết kế thuộc nhóm Behavioral Patterns, định nghĩa khung của một thuật toán trong một phương thức, cho phép các lớp con định nghĩa lại một số bước của thuật toán mà không thay đổi cấu trúc của nó. Mẫu thiết kế này giúp các lớp con chia sẻ cấu trúc chung của thuật toán trong khi vẫn cho phép thay đổi các chi tiết cụ thể.

2. Các trường hợp ứng dụng Template Method Pattern

  • Quy trình có các bước cố định: Khi cần triển khai các quy trình có các bước cố định nhưng chi tiết thực hiện có thể khác nhau.

  • Mã dùng chung: Khi cần chia sẻ các phần mã dùng chung giữa các lớp con.

  • Tách biệt khung và chi tiết: Khi cần tách biệt khung của thuật toán và chi tiết thực hiện.

3. Triển khai Template Method Pattern

3.1. Ví dụ triển khai đơn giản

Giả sử chúng ta có một quy trình chuẩn bị thức uống, với các bước chung như đun nước, pha chế, đổ vào cốc và thêm phụ liệu. Các chi tiết như pha trà hay cà phê có thể khác nhau.

// Bước 1: Tạo lớp trừu tượng với phương thức template
public abstract class Beverage {
    // Template method
    public final void prepare() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    protected abstract void brew();
    protected abstract void addCondiments();

    private void boilWater() {
        System.out.println("Boiling water");
    }

    private void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

// Bước 2: Tạo các lớp cụ thể
public class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Steeping the tea");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding lemon");
    }
}

public class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("Dripping coffee through filter");
    }

    @Override
    protected void addCondiments() {
        System.out.println("Adding sugar and milk");
    }
}

// Bước 3: Sử dụng Template Method Pattern
public class TemplateMethodPatternDemo {
    public static void main(String[] args) {
        Beverage tea = new Tea();
        tea.prepare();

        System.out.println();

        Beverage coffee = new Coffee();
        coffee.prepare();
    }
}

3.2. Ví dụ triển khai phức tạp

Giả sử chúng ta có một quy trình xử lý tài liệu với các bước như đọc tài liệu, xử lý nội dung, lưu kết quả và gửi thông báo. Các chi tiết như xử lý tài liệu văn bản hay PDF có thể khác nhau.

// Bước 1: Tạo lớp trừu tượng với phương thức template
public abstract class DocumentProcessor {
    // Template method
    public final void processDocument() {
        readDocument();
        processContent();
        saveResult();
        notifyUser();
    }

    protected abstract void readDocument();
    protected abstract void processContent();
    protected abstract void saveResult();
    protected abstract void notifyUser();
}

// Bước 2: Tạo các lớp cụ thể
public class TextDocumentProcessor extends DocumentProcessor {
    @Override
    protected void readDocument() {
        System.out.println("Reading text document");
    }

    @Override
    protected void processContent() {
        System.out.println("Processing text content");
    }

    @Override
    protected void saveResult() {
        System.out.println("Saving text result");
    }

    @Override
    protected void notifyUser() {
        System.out.println("Notifying user about text document processing");
    }
}

public class PDFDocumentProcessor extends DocumentProcessor {
    @Override
    protected void readDocument() {
        System.out.println("Reading PDF document");
    }

    @Override
    protected void processContent() {
        System.out.println("Processing PDF content");
    }

    @Override
    protected void saveResult() {
        System.out.println("Saving PDF result");
    }

    @Override
    protected void notifyUser() {
        System.out.println("Notifying user about PDF document processing");
    }
}

// Bước 3: Sử dụng Template Method Pattern
public class TemplateMethodPatternDemo {
    public static void main(String[] args) {
        DocumentProcessor textProcessor = new TextDocumentProcessor();
        textProcessor.processDocument();

        System.out.println();

        DocumentProcessor pdfProcessor = new PDFDocumentProcessor();
        pdfProcessor.processDocument();
    }
}

4. Phân tích các trường hợp ứng dụng Template Method Pattern

4.1. Quy trình có các bước cố định

  • Ưu điểm: Định nghĩa khung của một thuật toán, cho phép các bước cụ thể được định nghĩa lại bởi các lớp con.

  • Nhược điểm: Cần đảm bảo rằng các bước cố định thực sự không thay đổi để tránh sự xung đột giữa các lớp con.

4.2. Mã dùng chung

  • Ưu điểm: Chia sẻ các phần mã dùng chung giữa các lớp con, giảm thiểu sự trùng lặp mã nguồn.

  • Nhược điểm: Cần thiết kế cẩn thận để đảm bảo rằng các lớp con có thể sử dụng lại mã nguồn một cách hiệu quả.

4.3. Tách biệt khung và chi tiết

  • Ưu điểm: Tách biệt khung của thuật toán và chi tiết thực hiện, giúp mã nguồn dễ hiểu và dễ bảo trì hơn.

  • Nhược điểm: Cần đảm bảo rằng các lớp con tuân thủ đúng cấu trúc của phương thức template.

5. Kết luận

Template Method Pattern là một mẫu thiết kế mạnh mẽ và linh hoạt, giúp định nghĩa khung của một thuật toán trong khi cho phép các lớp con định nghĩa lại các bước cụ thể. Việc hiểu và áp dụng đúng Template Method Pattern sẽ giúp lập trình viên xây dựng các hệ thống dễ bảo trì, dễ mở rộng và hiệu quả hơn.

More from this blog

hoangkim

366 posts