ホーム > システムアーキテクト試験 > 2010年
システムアーキテクト試験 2010年 午前2 問03
デザインパターンの中のストラテジパターンを用いて,帳票出力のクラスを図のとおりに設計した。この帳票出カストラテジクラスの説明として、適切なものはどれか。

ウ:帳票出カストラテジクラスの中で、どのフォーマットで帳票を出力するかの振分けを行っている。
エ:帳票出力のアルゴリズムは、コンテキストクラスの中に記述する。
イ:新規フォーマット用のアルゴリズムの追加が容易である。(正解)
ア:クライアントは、どの帳票出カストラテジクラスがどのフォーマットに対応するかを意識せずに利用できる。
解説
ストラテジパターンを用いた帳票出力カストラテジクラスの設計【午前2 解説】
要点まとめ
- 結論:ストラテジパターンは新規フォーマット追加が容易な設計を実現し、拡張性に優れています。
- 根拠:抽象クラス「帳票出力カストラテジ」を継承した具体的な出力クラスが独立して実装されているため、既存コードに影響を与えずに新規クラスを追加可能です。
- 差がつくポイント:振り分け処理はコンテキストが担当し、アルゴリズムの切り替えを柔軟に行う点を理解しているかが重要です。
正解の理由
選択肢イ「新規フォーマット用のアルゴリズムの追加が容易である。」が正解です。
ストラテジパターンは「帳票出力カストラテジ」という抽象クラス(またはインターフェース)を定義し、具体的な出力形式(PDFやHTMLなど)をサブクラスで実装します。これにより、新しいフォーマットを追加する際は新たなサブクラスを作成するだけで済み、既存のコードを変更せずに拡張できます。つまり、オープン・クローズド原則(拡張には開かれ、修正には閉じている)を満たす設計です。
ストラテジパターンは「帳票出力カストラテジ」という抽象クラス(またはインターフェース)を定義し、具体的な出力形式(PDFやHTMLなど)をサブクラスで実装します。これにより、新しいフォーマットを追加する際は新たなサブクラスを作成するだけで済み、既存のコードを変更せずに拡張できます。つまり、オープン・クローズド原則(拡張には開かれ、修正には閉じている)を満たす設計です。
よくある誤解
- 振り分け処理を帳票出力カストラテジクラス内で行うと誤解しがちですが、実際はコンテキストが担当します。
- アルゴリズムをコンテキストに書くと柔軟性が失われ、ストラテジパターンの利点が活かせません。
解法ステップ
- ストラテジパターンの基本構造を理解する(抽象クラス+具体的戦略クラス+コンテキスト)。
- 図から「帳票出力カストラテジ」が抽象クラスであることを確認。
- 「PDF帳票出力カストラテジ」「HTML帳票出力カストラテジ」が具体的な戦略クラスであることを把握。
- コンテキストが戦略クラスを参照し、実際の処理を委譲していることを理解。
- 選択肢の中でストラテジパターンの特徴に合致するものを選ぶ。
選択肢別の誤答解説
- ア: クライアントはフォーマットを意識しないのは部分的に正しいが、ストラテジパターンの本質は拡張性にあり、説明としては不十分。
- イ: 新規フォーマット追加が容易である点がストラテジパターンの最大の利点であり正解。
- ウ: 振り分け処理はコンテキストが行うため、戦略クラス内で振り分けるのは誤り。
- エ: アルゴリズムはコンテキストではなく戦略クラスに記述し、コンテキストは切り替え役に徹する。
補足コラム
ストラテジパターンは「アルゴリズムのカプセル化」と「切り替えの柔軟性」を目的としたデザインパターンです。帳票出力のように複数の出力形式が存在する場合に特に有効で、メンテナンス性と拡張性を高める設計手法として広く使われています。
FAQ
Q: ストラテジパターンとテンプレートメソッドパターンの違いは?
A: ストラテジパターンはアルゴリズムをクラスとして切り出し、動的に切り替え可能にするのに対し、テンプレートメソッドは親クラスで処理の骨組みを定義し、部分的に子クラスで実装を変えるパターンです。
A: ストラテジパターンはアルゴリズムをクラスとして切り出し、動的に切り替え可能にするのに対し、テンプレートメソッドは親クラスで処理の骨組みを定義し、部分的に子クラスで実装を変えるパターンです。
Q: コンテキストクラスは何を担当しますか?
A: コンテキストは戦略クラスのインスタンスを保持し、クライアントからの呼び出しを適切な戦略に委譲する役割を持ちます。
A: コンテキストは戦略クラスのインスタンスを保持し、クライアントからの呼び出しを適切な戦略に委譲する役割を持ちます。
関連キーワード: ストラテジパターン, デザインパターン, 拡張性, 帳票出力, UMLクラス図, オープン・クローズド原則