🕒 Đăng ngày: 12/07/2025 | Lượt xem: 16
1. Strategy Pattern là gì?
Strategy Pattern cho phép bạn định nghĩa một tập hợp các thuật toán (các “chiến lược”), đặt chúng trong các lớp riêng biệt và cho phép hoán đổi linh hoạt tại runtime.
Nó tập trung vào đóng gói và linh hoạt: bạn xác định việc cần làm, nhưng cách thực hiện lại được giao cho các lớp chiến lược riêng biệt.

2. Tại sao nên dùng nó?
Nếu không dùng Strategy Pattern, thường chúng ta sẽ rơi vào:
- Các câu lệnh if-else hoặc switch quá dài
- Logic bị khóa chặt với nhau
- Code khó bảo trì và khó test
Trong khi đó, với Strategy Pattern, bạn có thể:
- Thay đổi logic mà không cần chỉnh sửa phần consumer
- Dễ dàng mock hoặc test từng chiến lược riêng rẽ
- Thỏa nguyên tắc Open/Closed: khi có hành vi mới, chỉ cần thêm class strategy mà không sửa class hiện tại
3. Tình huống ứng dụng thực tế: tích hợp Payment Gateway
Giả sử bạn xây dựng ứng dụng e‑commerce với nhiều phương thức thanh toán:
- Thẻ tín dụng
- PayPal
- Crypto
public class PaymentService
{
public void Pay(string paymentType)
{
if (paymentType == "CreditCard")
{
// Credit card logic
}
else if (paymentType == "PayPal")
{
// PayPal logic
}
else if (paymentType == "Crypto")
{
// Crypto logic
}
}
}Bạn sẽ tạo interface như IPaymentStrategy và cho mỗi loại thanh toán một implement riêng (như CreditCardPayment, PaypalPayment, CryptoPayment). Khi cần thanh toán, chỉ cần lưu chiến lược tương ứng và gọi:
paymentStrategy.Pay(amount);
Việc thêm loại mới (ví dụ: ApplePay) chỉ cần implement strategy mới mà không cần sửa bất cứ đoạn if-else nào.
4. Cách triển khai đơn giản trong .NET
Định nghĩa interface chung, ví dụ:
public interface IPaymentStrategy
{
void Pay(decimal amount);
}Tạo các lớp cụ thể:
public class CreditCardPayment : IPaymentStrategy { … }
public class PaypalPayment : IPaymentStrategy { … }
public class CryptoPayment : IPaymentStrategy { … }Trong client (ví dụ CheckoutService), inject hoặc khởi tạo strategy tương ứng và sử dụng:
checkoutService.ProcessPayment(new PaypalPayment());Không cần switch-case, client chỉ phụ thuộc vào interface.
5. Lợi ích chính
Giảm coupling: các implement với interface chứ không phải nhau
Tăng khả năng mở rộng: dễ thêm hành vi mới
Tăng khả năng test: dễ mock từng strategy
Tuân thủ SOLID, đặc biệt là OCP
6. Kết luận
Strategy Pattern là một giải pháp sạch và mạnh mẽ giúp ta:
- Tách biệt rõ ràng giữa việc “gì” và “cách làm”
- Giảm rối rắm logic nếu/else
- Dễ thêm hoặc thay thế hành vi
- Tăng khả năng kiểm thử từng phần
2025 FAiSE - All Rights Reserved.