Strategy パターン

デザインパターンちゃんと勉強をしようと思ったので結城さんの本を 1 つ 1 つ実装してみる。 前回の Bridgeからの続き。

Strategy パターンは、アプリケーションで使用されるアルゴリズムを動的に切り替える必要がある際に有用である。Strategy パターンはアルゴリズムのセットを定義する方法を提供し、これらを交換可能にすることを目的としている。Strategy パターンより、アルゴリズムを使用者から独立したまま様々に変化させることができるようになる。

上記の例の Python の例がおもしろいなと思うけどそれは置いておいて…:snake:

Strategy パターンは 振る舞い に対するパターンであるが、Bridge パターンは 構造 に対するパターンである。一般にコンテキストと戦略との結合は、Bridge パターンにおける抽象化と実装の結合より強固である。

あーー。確かに。構造と振る舞いで同じ構造だけど違うというのは分かりやすい。Strategy パターンを写経してて感じたのはこれ結局共通化した振る舞いを作れるけどその振る舞いに対しての修正が難しそうだよなぁと感じたし。

クラス図

Strategy PlantUML

自分としての理解・疑問

  • デザインパターンとして構造に注目する必要があるからだと思うけど書籍ではクラス図に Hand が含まれていない。
  • ただこういう実装の場合 Hand のような抽象化の仕組みにどこまで処理を持っていけるかも大事な気がしてここでは追加している。
<?php
public static function getHand(int $handvalue)
{
    if (self::$hand === false) {
        self::$hand = [];
        self::$hand[self::HANDVALUE_GUU] = new Hand(self::HANDVALUE_GUU);
        self::$hand[self::HANDVALUE_CHO] = new Hand(self::HANDVALUE_CHO);
        self::$hand[self::HANDVALUE_PAA] = new Hand(self::HANDVALUE_PAA);
    }
    return self::$hand[$handvalue];
}

たとえばこういうのは Player の方に持っていくとややこしくなりそう。

参考