戦略パターンは、一連のアルゴリズムを定義し、各アルゴリズムをカプセル化して相互に置換できるように、クライアント コードとアルゴリズムの特定の実装を分離する動作設計パターンです。このようにして、クライアントは元のコードを変更することなく、さまざまな要件に応じてさまざまなアルゴリズムを選択できます。
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;
}
戦略パターンのメリットとデメリット
アドバンテージ:
柔軟性の強化: 戦略パターンにより、クライアントの使用状況に関係なくアルゴリズムを変更できます。実行時にアルゴリズムを動的に選択して、さまざまなニーズやシナリオに柔軟に対応できます。
コードの再利用: 各戦略は複数のクライアントで共有でき、コードの重複を回避できます。
優れたスケーラビリティ: 新しいアルゴリズムを追加する必要がある場合、既存のコードを変更せずに新しい戦略クラスを追加するだけで済みます。
テストの容易さ: 戦略クラスは具体的なアルゴリズムをカプセル化しているため、単体テストが容易です。
欠点:
クラスの数を増やす: 特定のストラテジごとに対応するクラスが必要ですが、ストラテジが多い場合はクラスの数が増える可能性があり、コードのメンテナンスが複雑になります。
クライアントは戦略を理解する必要があります。クライアント コードは、選択を行うためにすべての戦略を理解する必要があります。戦略が多数ある場合、クライアント コードは複雑になる可能性があります。
一般に、戦略パターンは、実行時にアルゴリズムを動的に選択する必要があり、アルゴリズムとクライアント コードが分離されることが予想される状況に適しています。単純なケースでは、戦略パターンを使用する必要はないかもしれませんが、複雑なシナリオでは、戦略パターンを使用すると、保守性とスケーラビリティが向上する可能性があります。