戦略パターンは、一連のアルゴリズムを定義し、各アルゴリズムをカプセル化して互いに置き換えることができる行動設計パターンです。これにより、アルゴリズムの変更がアルゴリズムを使用してクライアントに影響を与えないことが保証されます。
ソフトウェア開発では、開発者は多くの場合、問題を解決するために異なる条件に応じて異なるアルゴリズムを選択する必要があります。すべてのアルゴリズムをコードに直接記述すると、コードを複雑で維持するのが難しくなります。ポリシーパターンは、クライアントの変更とは無関係に、アルゴリズムをさまざまなポリシーにカプセル化することにより、コードの保守性とスケーラビリティを向上させます。
戦略パターンは通常、3つの主要な役割で構成されています。
eコマースプラットフォームを開発しており、メンバーシップレベルに基づいて製品の割引価格を計算する必要があるとします。さまざまなメンバーシップレベルは、異なる割引アルゴリズムに対応しています。
まず、さまざまなメンバーシップレベルの割引アルゴリズムを表す抽象戦略クラスを定義する必要があります。
interface DiscountStrategy {
public function calculate($price);
}
次に、複数の特定の戦略クラスを定義して、異なる割引アルゴリズムを実装します。たとえば、通常のメンバーとVIPメンバーの割引アルゴリズム:
class RegularMemberDiscount implements DiscountStrategy {
public function calculate($price) {
// 通常のメンバーの割引の計算
$discountedPrice = $price * 0.9;
echo "普通のメンバーの割引価格:" . $discountedPrice . "\n";
}
}
class VIPMemberDiscount implements DiscountStrategy {
public function calculate($price) {
// VIPメンバー割引計算
$discountedPrice = $price * 0.8;
echo "VIP会員割引価格:" . $discountedPrice . "\n";
}
}
次に、現在のポリシーオブジェクトに基づいて割引を計算するために、環境クラスを定義する必要があります。
class DiscountCalculator {
private $strategy;
public function __construct(DiscountStrategy $strategy) {
$this->strategy = $strategy;
}
public function calculateDiscount($price) {
$this->strategy->calculate($price);
}
}
戦略モデルを使用することにより、さまざまなメンバーシップレベルに基づいて割引価格を簡単に計算できます。
$price = 100.0;
$regularMemberDiscount = new RegularMemberDiscount();
$vipMemberDiscount = new VIPMemberDiscount();
$calculator = new DiscountCalculator($regularMemberDiscount);
$calculator->calculateDiscount($price);
$calculator = new DiscountCalculator($vipMemberDiscount);
$calculator->calculateDiscount($price);
戦略モデルは一般的に使用される設計モデルであり、特にさまざまな状況に従ってアルゴリズムを柔軟に選択する必要があるシナリオに適しています。ポリシーパターンを通じて、アルゴリズムは独立したポリシークラスにカプセル化されるため、動的に置き換えることができます。これにより、システムの保守性が向上するだけでなく、新しいアルゴリズムの導入が容易になります。
この記事の例では、抽象的なポリシークラスと特定のポリシークラスの設計を通じて、クライアントからのアルゴリズムを正常に分離します。このようにして、新しいメンバーシップレベルを追加したり、将来の割引アルゴリズムを変更すると、クライアントコードへの影響を回避し、コードの再利用性とスケーラビリティを改善できます。