Ví dụ về Strategy Pattern trong C++
Bài viết này giới thiệu về Strategy Pattern trong C++, giải thích cách hoạt động và cung cấp ví dụ minh họa cụ thể giúp bạn hiểu rõ hơn về thiết kế mẫu này trong lập trình hướng đối tượng.
Strategy Pattern là một mẫu thiết kế cho phép thay đổi hành vi của một đối tượng tại runtime. Mẫu này thường được sử dụng để tách biệt thuật toán từ lớp sử dụng nó, giúp cho việc mở rộng và bảo trì mã dễ dàng hơn. Trong bài viết này, chúng ta sẽ tìm hiểu cách triển khai Strategy Pattern trong C++ thông qua một ví dụ đơn giản.
Mã C++
#include <iostream>
#include <memory>
// Chiến lược cơ sở
class Strategy {
public:
virtual void execute() = 0; // Hàm thuần ảo
};
// Chiến lược cụ thể A
class ConcreteStrategyA : public Strategy {
public:
void execute() override {
std::cout << "Executing Strategy A" << std::endl;
}
};
// Chiến lược cụ thể B
class ConcreteStrategyB : public Strategy {
public:
void execute() override {
std::cout << "Executing Strategy B" << std::endl;
}
};
// Context sử dụng chiến lược
class Context {
private:
std::unique_ptr<Strategy> strategy; // Con trỏ thông minh đến chiến lược
public:
void setStrategy(std::unique_ptr<Strategy> newStrategy) {
strategy = std::move(newStrategy);
}
void executeStrategy() {
if (strategy) {
strategy->execute();
} else {
std::cout << "Strategy not set!" << std::endl;
}
}
};
int main() {
Context context;
context.setStrategy(std::make_unique<ConcreteStrategyA>());
context.executeStrategy(); // Kết quả: Executing Strategy A
context.setStrategy(std::make_unique<ConcreteStrategyB>());
context.executeStrategy(); // Kết quả: Executing Strategy B
return 0;
}
Giải thích chi tiết từng dòng code
- Strategy: Là lớp cơ sở với phương thức
execute()
thuần ảo, định nghĩa giao diện cho các chiến lược cụ thể. - ConcreteStrategyA và ConcreteStrategyB: Là các lớp cụ thể kế thừa từ
Strategy
, định nghĩa các hành vi khác nhau cho phương thứcexecute()
. - Context: Lớp này chứa một con trỏ thông minh
strategy
, cho phép thiết lập và thực thi chiến lược. - setStrategy(): Phương thức dùng để thiết lập chiến lược mới cho context.
- executeStrategy(): Phương thức gọi đến hành vi của chiến lược đã được thiết lập.
- Trong
main()
, chúng ta tạo mộtContext
, thiết lập các chiến lược khác nhau và gọi phương thứcexecuteStrategy()
để thực thi.
Yêu cầu hệ thống:
- C++11 trở lên
Cách cài đặt các thư viện để chạy được đoạn mã C++ trên:
Đoạn mã trên sử dụng các tính năng cơ bản của C++, không cần cài đặt thư viện bên ngoài nào.
Lời khuyên:
- Strategy Pattern rất hữu ích khi bạn cần thay đổi thuật toán hoặc hành vi của một đối tượng mà không làm thay đổi mã nguồn của nó.
- Hãy cân nhắc sử dụng con trỏ thông minh (
std::unique_ptr
) để quản lý tài nguyên một cách an toàn.