Template Method

Template Method là một design pattern trong đó một khuôn mẫu được định nghĩa, chứa một số bước cơ bản của một thuật toán, trong khi các bước cụ thể được định nghĩa bởi các lớp con. Khuôn mẫu này đảm bảo rằng các bước cơ bản của thuật toán được thực hiện theo cùng một cách, nhưng cách thức cụ thể của từng bước có thể được thay đổi bởi các lớp con.

abstract class Report {
    public function generate() {
        $this->setData();
        $this->formatData();
        $this->generateOutput();
    }
    
    abstract protected function setData();
    
    protected function formatData() {
        // default implementation
    }
    
    abstract protected function generateOutput();
}

class PdfReport extends Report {
    protected function setData() {
        // set data for pdf report
    }
    
    protected function generateOutput() {
        // generate pdf output
    }
}

class ExcelReport extends Report {
    protected function setData() {
        // set data for excel report
    }
    
    protected function generateOutput() {
        // generate excel output
    }
}

Trong đoạn code này, Report là một abstract class định nghĩa khuôn mẫu cho việc tạo ra báo cáo. Phương thức generate() định nghĩa các bước cơ bản trong việc tạo ra báo cáo, bao gồm setData(), formatData()generateOutput(). Trong đó, setData()generateOutput() là các phương thức trừu tượng và phải được định nghĩa bởi các lớp con. Trong khi đó, formatData() có một implementation mặc định, nhưng có thể được ghi đè bởi các lớp con nếu cần thiết.

Các lớp con, như PdfReportExcelReport, kế thừa từ Report và định nghĩa các phương thức trừu tượng để thực hiện các bước cụ thể trong việc tạo ra báo cáo. Ví dụ, PdfReport định nghĩa setData() để thiết lập dữ liệu cho báo cáo PDF, và generateOutput() để tạo ra đầu ra PDF. Tương tự, ExcelReport định nghĩa setData()generateOutput() để tạo ra báo cáo Excel.

Khi chúng ta muốn tạo ra một báo cáo, chúng ta có thể tạo một đối tượng của lớp con và gọi phương thức generate(). Phương thức này sẽ thực hiện các bước cơ bản của thuật toán và gọi các phương thức cụ thể của lớp con để thực hiện các bước cụ