システムアーキテクト 2025年 午前2 問05
問題文
デザインパターンの一つであるObserverパターンを利用して実現できることはどれか。
選択肢
ア:あるオブジェクトの状態が変化したときに、それに依存する全てのオブジェクトに自動的に通知する。(正解)
イ:ある機能をもつオブジェクトを新しいオブジェクトでラップし、機能を動的に拡張する。
ウ:あるクラスのインスタンスが一つしか存在しないことを保証する。
エ:配列や集合のような実装の異なるコンテナに対し、同一のインタフェースでアクセスする。
Observerパターンで実現できること【午前2 解説】
要点まとめ
- 結論→Observerパターンは、あるオブジェクトの状態変化を依存する全てのオブジェクトに自動的に通知し、疎結合で複数の購読者を管理できる設計である。
- 根拠→被観測者(Subject)と購読者(Observer)を明確に分離し、購読登録・解除によって通知対象を動的に変更できる点が本質である。
- 差がつくポイント→push/pullの通知方式、スレッド安全性、弱参照でのメモリ管理など実装上の注意点を理解して取捨選択することが重要である。
正解の理由
正解は ア です。Observerパターンは「あるオブジェクトの状態が変化したときに、それに依存する全てのオブジェクトに自動的に通知する」ことを目的としたパターンで、Subjectが状態変化を検知して登録されたObserverへ通知を行います。これにより通知の受け手(Observer)と送り手(Subject)が疎結合になり、拡張性と柔軟性が向上します。問題文の文言はまさにObserverパターンの定義に一致します。
よくある誤解(2〜3 行)
- Observerは単に「イベントを渡す」だけでなく、登録・解除の管理や通知戦略(push/pull)が設計上の主要点です。
- 「通知=同期的」に行う前提は誤りで、非同期やスレッド安全性の考慮が必要です。
解法ステップ(番号付きリスト)
- 問題文のキーワード(状態変化、依存する全てのオブジェクト、自動通知)を拾う。
- 代表的なデザインパターンの定義を頭の中で照合する(Observer, Decorator, Singleton, Iterator等)。
- 各選択肢の要旨を短く置き換え、問題文と最も一致するものを選ぶ。
- 一致度で判断できない場合は、典型的な使用例(GUIイベント、MVCのView更新)を思い出す。
- 実装上の注意(登録/解除、メモリ管理、同期)も頭に入れて正答を確認する。
選択肢別の誤答解説
- ア: 正解。SubjectとObserverの関係を通じて状態変化を自動通知するパターンであり、まさに問題文の説明と一致します。
- イ: 誤り。オブジェクトをラップして機能を動的に拡張するのはDecoratorパターンで、Observerとは目的が異なります。
- ウ: 誤り。インスタンスを1つだけに限定するのはSingletonパターンで、通知機構とは別物です。
- エ: 誤り。配列や集合など異なるコンテナに同一の方法でアクセスするのはIterator(イテレータ)パターンの説明で、Observerとは役割が異なります。
補足コラム(関連知識など)
- 通知方式:push方式はSubjectが変更データをObserverに渡す方式、pull方式はObserverが必要な情報をSubjectから取りに行く方式です。用途に応じて使い分けます。
- 実装上の注意:多数のObserverを保持するときのメモリリークや、Observerが長寿命の場合の参照管理(弱参照の利用)、通知中の例外処理やスレッド競合に注意が必要です。
- 参考実装(Pythonの簡易例):
class Subject:
def __init__(self):
self._observers = []
self._state = None
def attach(self, obs):
self._observers.append(obs)
def detach(self, obs):
self._observers.remove(obs)
def notify(self):
for obs in list(self._observers):
obs.update(self)
def set_state(self, value):
self._state = value
self.notify()
class Observer:
def update(self, subject):
print("State changed to"、subject._state)
s = Subject()
o = Observer()
s.attach(o)
s.set_state(10) # Observerが自動的に通知される
- 実務ではイベントバスやリアクティブライブラリ(Rx)でさらに発展した形が使われます。
FAQ(Q:/A: を 2〜3 組)
Q: Observerパターンは同期的にしか使えませんか?
A: いいえ。同期・非同期どちらでも実装可能で、非同期通知やキューを使う設計も一般的です。
A: いいえ。同期・非同期どちらでも実装可能で、非同期通知やキューを使う設計も一般的です。
Q: ObserverとPublisher-Subscriberは同じですか?
A: 概念は近いですが、Pub/Subはメッセージングミドルウェアを介する場合が多く、Observerはオブジェクト間の直接的な通知に重点があります。
A: 概念は近いですが、Pub/Subはメッセージングミドルウェアを介する場合が多く、Observerはオブジェクト間の直接的な通知に重点があります。
Q: 大量のObserverがいると何が問題になりますか?
A: メモリ使用や通知コスト、通知中の例外伝播やスレッド競合が問題になり得ます。弱参照や分割通知などで対処します。
A: メモリ使用や通知コスト、通知中の例外伝播やスレッド競合が問題になり得ます。弱参照や分割通知などで対処します。
関連キーワード: Observerパターン、オブザーバ、デザインパターン、イベント駆動、MVC, Decorator, Singleton, Iterator, pub/sub, push/pull

\ せっかくなら /
システムアーキテクトを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

