Template Method khớp hơn khi khung xử lý cố định và chỉ vài bước thay đổi.
Lớp cha giữ trình tự, lớp con điền phần khác nhau.
abstract class ImportJob {
async run(file: Buffer) { // trình tự cố định
const rows = this.parse(file)
const valid = this.validate(rows)
await this.persist(valid)
await this.report(valid.length)
}
protected abstract parse(file: Buffer): Row[]
protected validate(rows: Row[]) { return rows.filter(isValid) }
}
class CsvImportJob extends ImportJob {
protected parse(file: Buffer) { /* ... */ }
}Strategy khớp hơn khi phần thay đổi là một hành vi độc lập cần chọn lúc chạy hoặc dùng lại ở nhiều ngữ cảnh:
class ImportJob {
constructor(private parser: RowParser) {}
async run(file: Buffer) { const rows = this.parser.parse(file); /* ... */ }
}So sánh ngắn:
- Template Method dùng kế thừa, ràng buộc lúc biên dịch, chỉ đổi được bằng cách tạo subclass mới.
- Strategy dùng composition, đổi được lúc chạy, và parser có thể tái sử dụng ngoài job.
Chọn thế nào: khung nhiều bước, thứ tự là phần giá trị chính, biến thể ít và biết trước → Template Method. Điểm thay đổi chỉ một hai chỗ, cần cấu hình động, hoặc số biến thể còn tăng → Strategy. Trong TS/JS, Strategy thường gọn hơn vì có thể truyền thẳng function thay vì dựng cây kế thừa.