【デザインパターン】戦略パターン

戦略パターンは、一連のアルゴリズムを定義し、各アルゴリズムをカプセル化して相互に置換できるように、クライアント コードとアルゴリズムの特定の実装を分離する動作設計パターンです。このようにして、クライアントは元のコードを変更することなく、さまざまな要件に応じてさまざまなアルゴリズムを選択できます。

C は戦略パターンを実装します

#include <stdio.h>
#include <stdlib.h>

// 定义策略接口
typedef struct {
    
    
    void (*execute)(void);
} Strategy;

// 具体策略1
void strategy1_execute(void) {
    
    
    printf("Executing Strategy 1\n");
}

// 具体策略2
void strategy2_execute(void) {
    
    
    printf("Executing Strategy 2\n");
}

// 客户端代码,使用策略接口
void client_code(Strategy* strategy) {
    
    
    strategy->execute();
}

int main() {
    
    
    // 创建策略对象
    Strategy* strategy1 = (Strategy*)malloc(sizeof(Strategy));
    strategy1->execute = strategy1_execute;

    Strategy* strategy2 = (Strategy*)malloc(sizeof(Strategy));
    strategy2->execute = strategy2_execute;

    // 使用不同的策略
    client_code(strategy1);
    client_code(strategy2);

    // 释放内存
    free(strategy1);
    free(strategy2);

    return 0;
}

C++ は戦略パターンを実装します

#include <iostream>

// 定义策略接口
class Strategy {
    
    
public:
    virtual void execute() = 0;
    virtual ~Strategy() {
    
    }
};

// 具体策略1
class Strategy1 : public Strategy {
    
    
public:
    void execute() override {
    
    
        std::cout << "Executing Strategy 1" << std::endl;
    }
};

// 具体策略2
class Strategy2 : public Strategy {
    
    
public:
    void execute() override {
    
    
        std::cout << "Executing Strategy 2" << std::endl;
    }
};

// 客户端代码,使用策略接口
void client_code(Strategy* strategy) {
    
    
    strategy->execute();
}

int main() {
    
    
    // 使用不同的策略
    Strategy1 strategy1;
    Strategy2 strategy2;

    client_code(&strategy1);
    client_code(&strategy2);

    return 0;
}

戦略パターンのメリットとデメリット

アドバンテージ:

柔軟性の強化: 戦略パターンにより、クライアントの使用状況に関係なくアルゴリズムを変更できます。実行時にアルゴリズムを動的に選択して、さまざまなニーズやシナリオに柔軟に対応できます。
コードの再利用: 各戦略は複数のクライアントで共有でき、コードの重複を回避できます。
優れたスケーラビリティ: 新しいアルゴリズムを追加する必要がある場合、既存のコードを変更せずに新しい戦略クラスを追加するだけで済みます。
テストの容易さ: 戦略クラスは具体的なアルゴリズムをカプセル化しているため、単体テストが容易です。

欠点:

クラスの数を増やす: 特定のストラテジごとに対応するクラスが必要ですが、ストラテジが多い場合はクラスの数が増える可能性があり、コードのメンテナンスが複雑になります。
クライアントは戦略を理解する必要があります。クライアント コードは、選択を行うためにすべての戦略を理解する必要があります。戦略が多数ある場合、クライアント コードは複雑になる可能性があります。
一般に、戦略パターンは、実行時にアルゴリズムを動的に選択する必要があり、アルゴリズムとクライアント コードが分離されることが予想される状況に適しています。単純なケースでは、戦略パターンを使用する必要はないかもしれませんが、複雑なシナリオでは、戦略パターンを使用すると、保守性とスケーラビリティが向上する可能性があります。

おすすめ

転載: blog.csdn.net/qq_43577613/article/details/132005798