平成27年度 秋期 システムアーキテクト試験 午前Ⅱ 問5

デザインパターンの中のストラテジパターンを用いて,帳票出力のクラスを図のとおりに設計した。適切な説明はどれか。

ストラテジパターンを用いた帳票出力のクラス図
図の説明テキスト

ストラテジパターンを用いた帳票出力のUMLクラス図と凡例。構成要素は以下のとおり。1. クラス「コンテキスト」(属性・操作の記述なし):「帳票出力ストラテジ」へ集約(コンテキスト側が白抜きひし形、帳票出力ストラテジ側が開いた矢印の誘導可能性あり)の関係を持つ。2. クラス「帳票出力ストラテジ」(属性なし、操作:「+ 帳票出力()」)。3. クラス「PDF帳票出力ストラテジ」(属性なし、操作:「+ 帳票出力()」):「帳票出力ストラテジ」への汎化(白抜き三角矢印)関係を持つ。4. クラス「HTML帳票出力ストラテジ」(属性なし、操作:「+ 帳票出力()」):「帳票出力ストラテジ」への汎化(白抜き三角矢印)関係を持つ。5. 右上に「凡例」:クラスの表記法として上から「クラス名」「属性」「操作」の3区画からなる矩形が示されている。

解答・解説

正解: イ. 新規フォーマット用のアルゴリズムの追加が容易である。

ストラテジ(Strategy)パターンは、アルゴリズム(処理の手順・方式)をクラスとして独立させ、動的に切り替えられるようにするデザインパターンです。

問題に示されたUMLクラス図では、以下のように役割が分担されています。

  • コンテキスト:「帳票出力ストラテジ」を集約しており、共通のインタフェースである + 帳票出力() を呼び出して処理を実行します。
  • 帳票出力ストラテジ:すべての帳票出力アルゴリズムに共通する操作 + 帳票出力() を定義する抽象クラス(またはインタフェース)です。
  • PDF帳票出力ストラテジ / HTML帳票出力ストラテジ:「帳票出力ストラテジ」を継承(汎化)し、それぞれのフォーマットに応じた具体的な帳票出力のアルゴリズムを + 帳票出力() の中に実装するサブクラスです。

このようにアルゴリズムごとにサブクラスを分離する設計にすることで、例えば「CSV帳票出力ストラテジ」のような新しいフォーマットを追加したい場合でも、既存の「コンテキスト」や他のサブクラスを変更することなく、「帳票出力ストラテジ」の新しいサブクラスを追加するだけで容易に対応できます。したがって、正解はイです。

各選択肢の解説

  • ア:クライアント(利用者)は、どのフォーマット(PDFかHTMLか)で出力したいかに応じて、対応する具象サブクラスのインスタンスを生成してコンテキストに設定する必要があります。そのため、クライアントはサブクラスを意識する必要があります(サブクラスを意識せずに利用できるのはコンテキストクラスです)。
  • イ:正解です。新規フォーマット用のクラスを「帳票出力ストラテジ」のサブクラスとして新たに追加するだけで済むため、既存コードへの影響がなく追加が容易です。
  • ウ:「帳票出力ストラテジ」は共通の操作 + 帳票出力() を定義するのみであり、内部でフォーマットの振り分け(条件分岐)は行いません。ポリモーフィズム(多態性)によって、設定されたサブクラスの操作が自動的に呼び出されます。
  • エ:具体的な帳票出力のアルゴリズムは、「コンテキスト」の中ではなく、「PDF帳票出力ストラテジ」や「HTML帳票出力ストラテジ」といった各サブクラスの中に記述します。

Spineチーム