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

  1. 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ể.
  2. ConcreteStrategyAConcreteStrategyB: 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ức execute().
  3. 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.
  4. setStrategy(): Phương thức dùng để thiết lập chiến lược mới cho context.
  5. executeStrategy(): Phương thức gọi đến hành vi của chiến lược đã được thiết lập.
  6. Trong main(), chúng ta tạo một Context, thiết lập các chiến lược khác nhau và gọi phương thức executeStrategy() để 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.


Các Hướng Dẫn Cùng Chủ Đề Đang Xem

Phân trang kết quả truy vấn MySQL bằng C++

Hướng dẫn chi tiết cách phân trang kết quả truy vấn MySQL bằng C++ với Prepared Statements. Bài viết giúp bạn hiểu cách truy vấn dữ liệu và phân trang hiệu quả trong C++ khi làm việc với MySQL.
Cách truyền Authentication Header Token khi POST dữ liệu tới API bằng C++

Hướng dẫn cách truyền token xác thực thông qua Authentication Header khi gửi yêu cầu POST dữ liệu tới API bằng ngôn ngữ C++. Sử dụng thư viện `libcurl` để thực hiện việc gửi yêu cầu HTTP với token xác thực.
Ví dụ về lập trình hướng đối tượng (OOP) trong C++

Bài viết này cung cấp ví dụ minh họa về lập trình hướng đối tượng (OOP) trong C++, bao gồm các khái niệm như lớp, đối tượng, kế thừa và đa hình.
Cách gửi POST dữ liệu tới API bằng C++ sử dụng thư viện libcurl

Hướng dẫn cách gửi dữ liệu đến API bằng phương thức POST trong C++ sử dụng thư viện libcurl. Bài viết sẽ giúp bạn hiểu cách cấu hình và gửi các yêu cầu HTTP POST đến một API RESTful.
Chuyển chuỗi Markdown sang HTML bằng C++

Hướng dẫn chi tiết cách chuyển đổi chuỗi Markdown sang HTML bằng C++. Bài viết này sẽ giúp bạn nắm bắt cách sử dụng thư viện Markdown để thực hiện việc chuyển đổi một cách dễ dàng và hiệu quả.
Tạo watermark cho hình ảnh bằng C++

Hướng dẫn cách tạo watermark cho hình ảnh trong C++ bằng cách sử dụng thư viện OpenCV. Bài viết này giúp bạn hiểu cách thêm văn bản hoặc hình ảnh vào một bức ảnh để tạo ra watermark.
Xác thực JSON Web Token (JWT) với C++

Bài viết này sẽ hướng dẫn cách sử dụng JSON Web Token (JWT) trong C++ để xác thực người dùng, bao gồm các bước tạo và xác minh token với các thư viện C++ phổ biến.
Cập nhật nhiều cột trong MySQL bằng C++

Hướng dẫn chi tiết cách cập nhật nhiều cột trong MySQL bằng C++ với Prepared Statements. Bài viết giúp bạn hiểu cách sử dụng Prepared Statements để cập nhật dữ liệu một cách an toàn và hiệu quả.
Lấy ký tự cuối cùng của chuỗi trong C++

Hướng dẫn cách lấy ký tự cuối cùng của một chuỗi trong C++ bằng cách sử dụng các phương thức và cú pháp của thư viện `string`. Bài viết giúp bạn hiểu cách xử lý chuỗi và truy xuất ký tự trong C++.
Ví dụ về Factory Pattern trong C++

Bài viết này sẽ trình bày về Factory Pattern trong C++, một mẫu thiết kế phổ biến giúp tạo ra các đối tượng mà không cần chỉ định rõ lớp cụ thể của đối tượng đó. Điều này giúp tăng tính linh hoạt và khả năng mở rộng cho mã nguồn.

Đã thêm vào giỏ hàng