オブザーバーパターン適用例(TinyClock Console版)
概要
- デザインパターンのオブザーバーパターンを時計アプリへの適用例をPythonコードで示す。
- デジタル時計とアナログ時計を表示するアプリを作成した。
- このアプリをTinyClockと呼ぶこととする。
- TinyClockはMVC(Model-View-Controller)で作成することとする。(実際にはModel-View)
実行
実行方法
- 実行方法は、コマンドラインから以下を実行。
- %python TinyClockMain_console.py
- プログラムは無限ループになっているので、C-cで強制終了。
実行イメージ
- TinyClockMain_consoleを実行すると以下のように表示される。
TinyClock(console版) Python全ソースコード
以下URLに全ソースコードを保存している。
TinyClock(Console版)
ディレクトリ構成
ソースコードのディレクトリ構成を以下に示す。
.
└── sources // ソースコードファイルを保存したディレクトリ
├── Lib
│ └── Observer.py // Observerパターン Pythonソースコード
│
├── Model
│ ├── Lib -> ../Lib // シンボリックリンク(1つ上のディレクトリのLib)
│ └── TinyClockModel.py // 時計本体部 Pythonソースコード
│
├── View
│ │
│ ├── Lib -> ../Lib // シンボリックリンク(1つ上のディレクトリのLib)
│ └── TinyClockView.py // 時計表示部(データ保持)
│
└── TinyClockMain_console.py // コンソール用 main関数(本ファイルをpythonで実行するとコンソールに時刻を表示する)
UML
クラス図とシーケンス図を以下に示す。
クラス図
シーケンス図
TinyClockModel Pythonソースコード(一部抜粋)
- TinyClockModelクラスは、MVCモデルのModel部である。
- TinyClockModelクラスは、Sujectクラスを継承する。
- TinyClockModelクラスのset_timeメソッドで以下を行う。
- 現在時刻取得
- Subjectクラスから継承しているnotifyメソッドを呼ぶ
- notifyメソッドを呼ぶことによって、登録されている全Observerへ通知を行う。
- ソースコードの詳細はTinyClockModel.pyを参照。
TinyClockModelクラスのソースコード一部抜粋を以下に示す。
1 | class TinyClockModel(Subject): |
TinyClockView Pythonソースコード(一部抜粋)
- TinyClockViewクラスは、MVCモデルのView部である。
- TinyClockViewクラスは、Observerクラスを継承する。
- TinyClockViewクラスは、表示データを保持するクラスである。
- TinyClockViewクラスのupdateメソッドで以下を行う。
- Subjectクラスからの通知を受け取る
- 表示用データの保存メソッドであるset_timeを呼ぶ
- ソースコードの詳細はTinyClockView.pyを参照。
TinyClockViewクラスのソースコード一部抜粋を以下に示す。
1 | class TinyClockView(Observer): |
TinyClockMain_console Pythonソースコード
- TinyClockMain_consoleは、以下クラスをインスタンス化し、制御する。
- TinyClockModel
- TinyClockView
- 時計本体部(TinyClockModel)を以下でインスタンス化
- theModel = TinyClockModel()
- アナログ時計及びデジタル時計をインスタンス化している。
- theAnalogClockView = TinyClockView()
- theDigitalClockView = TinyClockView()
- Subjectクラスのattachメソッドで、時計本体部と表示部を接続している。
- 時計表示用にスレッドを生成し、各時計独立で表示するようにしている。
- ソースコードの詳細はTinyClockMain_console.pyを参照。
1 | def main(): |