エンベデッドシステムスペシャリスト 2023年 午前2 問17
問題文
デザインパターンの中のストラテジパターンを用いて、帳票出力のクラスを図のとおりに設計した。適切な説明はどれか。

選択肢
ア:クライアントは、使用したいフォーマットに対応する、帳票出力ストラテジクラスのサブクラスを意識せずに利用できる。
イ:新規フォーマット用のアルゴリズムの追加が容易である。(正解)
ウ:帳票出力ストラテジクラスの中で、どのフォーマットで帳票を出力するかの振り分けを行っている。
エ:帳票出力のアルゴリズムは、コンテキストクラスの中に記述する。
🔒 解説は解答すると表示されます
ストラテジパターン【午前2解説】
正解の理由
ストラテジパターンは、処理のアルゴリズムをクラスとして分離し、共通のインタフェースを通じて切り替えられるようにするデザインパターンです。
図では、「帳票出力ストラテジ」を基底クラスとし、「PDF 帳票出力ストラテジ」と「HTML 帳票出力ストラテジ」がそれぞれ具体的な帳票出力処理を実装しています。コンテキストはストラテジを保持し、帳票出力を委譲する構成です。
この構成では、新しいフォーマットを追加するとき、既存のコンテキストの処理を大きく変更せずに、新しいストラテジのサブクラスを追加できます。そのため、適切な説明はイです。
解法ステップ
-
共通の親クラスを確認します。
「帳票出力ストラテジ」が、帳票出力処理の共通の枠組みです。 -
具体的な処理の置き場所を確認します。
PDF用・HTML用の各サブクラスが、それぞれのフォーマットに対応する処理を担います。 -
コンテキストの役割を確認します。
コンテキストはストラテジを利用し、処理を委譲します。フォーマットごとの出力アルゴリズムを自分で抱え込む設計ではありません。 -
拡張のしやすさを判断します。
新しいフォーマットには、新しいストラテジのサブクラスを追加できます。したがって、新規アルゴリズムの追加が容易だと説明するイが適切です。
選択肢別の誤答解説
-
ア:誤りです。
ストラテジパターンでは、通常、利用するアルゴリズムに対応した具体的なストラテジを選択して設定します。コンテキストは具体的なクラスを意識せずに処理を委譲できますが、クライアントが使用するフォーマットを決める場合には、対応するストラテジの選択に関わります。「クライアントはサブクラスを意識せずに利用できる」と一律に述べるのは適切ではありません。 -
イ:正しい説明です。
新しいフォーマットの処理を新しいストラテジとして追加できます。既存の処理を変更する範囲を抑えやすい構成です。 -
ウ:誤りです。
フォーマットごとの処理を振り分けるために、ストラテジの中で条件分岐を行う設計ではありません。具体的なストラテジ自体が、それぞれのアルゴリズムを実装します。 -
エ:誤りです。
帳票出力のアルゴリズムは、コンテキストではなく具体的なストラテジに記述します。コンテキストはストラテジに処理を委譲します。
よくある誤解
-
コンテキストがアルゴリズムを実行すると考える
コンテキストは処理の利用・委譲を担当し、具体的なアルゴリズムはストラテジ側に分離されています。 -
ストラテジが処理を選び分けると考える
基底クラスがフォーマットを判定するのではなく、選択された具体的なストラテジが対応する処理を実行します。 -
新しい処理の追加には既存クラスの修正が必須だと考える
ストラテジパターンでは、新しいサブクラスを追加することで拡張しやすくなります。
補足コラム
ストラテジパターンは、「処理を選択・切り替える側」と「処理の具体的な内容」を分ける考え方です。たとえば、帳票出力以外にも、配送方法、料金計算方法、圧縮方式など、複数のアルゴリズムを切り替える場面で利用できます。
FAQ
Q. 新しいフォーマットを追加するとき、コンテキストも変更する必要がありますか?
A. ストラテジパターンの狙いは、具体的なアルゴリズムの追加による既存コードへの影響を抑えることです。通常は新しいストラテジを追加し、コンテキストは共通のストラテジを通じて利用します。
A. ストラテジパターンの狙いは、具体的なアルゴリズムの追加による既存コードへの影響を抑えることです。通常は新しいストラテジを追加し、コンテキストは共通のストラテジを通じて利用します。
Q. クライアントは具体的なストラテジをまったく知らなくてよいですか?
A. コンテキストを通じて処理を利用できますが、使用するアルゴリズムを選ぶ場面では、クライアントや設定機構が具体的なストラテジを選択することがあります。
A. コンテキストを通じて処理を利用できますが、使用するアルゴリズムを選ぶ場面では、クライアントや設定機構が具体的なストラテジを選択することがあります。
関連キーワード: デザインパターン、ストラテジパターン、コンテキスト、アルゴリズムの切替、オープン・クローズドの原則

\ せっかくなら /
エンベデッドシステムスペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

