Mẫu Chiến Lược và Mẫu Phương Thức Mẫu

  1. Mẫu Chiến Lược

Mẫu Chiến Lược (Strategy Pattern) là mẫu thiết kế hành vi cho phép định nghĩa tập hợp thuật toán, đóng gói từng thuật toán thành lớp riêng biệt và hoán đổi linh hoạt giữa các thuật toán.

Sử dụng mẫu này khi có nhiều lớp tương tự nhau nhưng khác biệt trong cách thực hiện hành vi cụ thể. Mẫu Chiến Lược tách biệt nghiệp vụ chính với logic thuật toán.

Cấu trúc chính gồm:

  • Giao diện chiến lược: Khai báo phương thức
  • Lớp chiến lược cụ thể: Triển khai giao diện
  • Lớp ngữ cảnh: Sử dụng chiến lược trong nghiệp vụ

Ví dụ minh họa với hệ thống xuất dữ liệu:

Giao diện ExportStrategy.java

public interface ExportStrategy {
    String generateOutput(List<DataRecord> records);
    void saveToDestination(String content);
}

Triển khai CSV:

public class CsvExport implements ExportStrategy {
    public String generateOutput(List<DataRecord> records) {
        StringBuilder csv = new StringBuilder();
        for (DataRecord record : records) {
            csv.append(record.toCsvRow());
        }
        return csv.toString();
    }
    
    public void saveToDestination(String content) {
        Files.write("output.csv", content.getBytes());
    }
}

Triển khai JSON:

public class JsonExport implements ExportStrategy {
    public String generateOutput(List<DataRecord> records) {
        return new Gson().toJson(records);
    }
    
    public void saveToDestination(String content) {
        Files.write("output.json", content.getBytes());
    }
}

Lớp ngữ cảnh:

public class ExportService {
    private ExportStrategy strategy;
    
    public void setStrategy(ExportStrategy strategy) {
        this.strategy = strategy;
    }
    
    public void executeExport(List<DataRecord> data) {
        String output = strategy.generateOutput(data);
        strategy.saveToDestination(output);
    }
}
  1. Mẫu Phương Thức Mẫu

Mẫu Phương Thức Mẫu (Template Method Pattern) định nghĩa khung thuật toán trong lớp cơ sở, cho phép lớp con ghi đè các bước cụ thể mà không thay đổi cấu trúc.

Áp dụng khi nhiều lớp có thuật toán tương tự nhưng khác biệt ở một số bước nhỏ. Mẫu này loại bỏ trùng lặp bằng cách đưa logic chung lên lớp cha.

Cách triển khai:

  1. Phân tách thuật toán thành các bước
  2. Tạo lớp trừu tượng với phương thức mẫu
  3. Lớp con triển khai bước thay đổi

Ví dụ với xử lý dữ liệu:

public abstract class DataProcessor {
    public final void process() {
        readData();
        transform();
        saveResult();
    }
    
    protected abstract void transform();
    
    private void readData() {
        // Logic đọc chung
    }
    
    private void saveResult() {
        // Logic lưu chung
    }
}

public class EncryptionProcessor extends DataProcessor {
    protected void transform() {
        // Mã hóa dữ liệu
    }
}

public class CompressionProcessor extends DataProcessor {
    protected void transform() {
        // Nén dữ liệu
    }
}

So sánh:

  • Mẫu Chiến Lược: Hoán đổi thuật toán động tại thời gian chạy
  • Mẫu Phương Thức Mẫu: Cố định cấu trúc thuật toán, thay đổi từng bước
  • Cả hai đều tuân thủ nguyên tắc Đóng/Mở trong SOLID
  • java.util.Comparator là ví dụ điển hình của Mẫu Chiến Lược
  • java.io.InputStream minh họa cho Mẫu Phương Thức Mẫu

Thẻ: design-pattern strategy-pattern template-method-pattern behavioral-patterns

Đăng vào ngày 7 tháng 7 lúc 16:15