オブザーバーパターン適用例(TinyClock GUI版)
概要
- デザインパターンのオブザーバーパターンを時計アプリへの適用例をPythonコードで示す。
- デジタル時計とアナログ時計を表示するアプリを作成した。 GUIで表示することとする。
- このアプリをTinyClockと呼ぶこととする。
- TinyClockはMVC(Model-View-Controller)で作成することとする。(実際にはModel-View)
実行
実行方法
- 実行方法は、コマンドラインから以下を実行。
- %python TinyClockMain_gui.py
実行イメージ
- TinyClockMain_guiを実行すると以下のように表示される。
TinyClock(GUI版) Python全ソースコード
以下URLに全ソースコードを保存している。
TinyClock(GUI版)
ディレクトリ構成
ソースコードのディレクトリ構成を以下に示す。
.
└── sources // ソースコードファイルを保存したディレクトリ
├── Lib
│ └── Observer.py // Observerパターン Pythonソースコード
│
├── Model
│ ├── Lib -> ../Lib // シンボリックリンク(1つ上のディレクトリのLib)
│ └── TinyClockModel.py // 時計本体部 Pythonソースコード
│
├── View
│ ├── GUI // GUI mainwindow.ui以外使用しない
│ │ ├── GUI.pro // Qt Creatorファイル
│ │ ├── GUI.pro.user
│ │ ├── main.cpp
│ │ ├── mainwindow.cpp
│ │ ├── mainwindow.h
│ │ └── mainwindow.ui // GUI メインウィンドウ XML(Qt Creatorで自動生成される)
│ │
│ ├── Lib -> ../Lib // シンボリックリンク(1つ上のディレクトリのLib)
│ ├── TinyClockView.py // 時計表示部(データ保持)
│ ├── TinyClockViewGUI.py // 時計表示部(GUI)
│ └── mainwindow.py // mainwindow.uiをPythonソースコードへ変換したもの
│
└── main_gui.py // GUI用 main関数(本ファイルをpythonで実行するとデジタル時計とアナログ時計をGUI表示する)
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): |
TinyClockViewGUI Pythonソースコード(一部抜粋)
TinyDigitalClockView
- TinyDigitalClockViewクラスは、デジタル時計のGUI表示部である。
- TinyDigitalClockViewクラスは、メンバー変数としてTinyClockViewクラスを持つ。
- TinyDigitalClockViewクラスのdraw_viewメソッドは、デジタル時計を描画する。
- ソースコードの詳細はTinyClockViewGUI.pyを参照。
1 | class TinyDigitalClockView(QtGui.QWidget): |
TinyAnalogClockView
- TinyAnalogClockViewクラスは、アナログ時計のGUI表示部である。
- TinyAnalogClockViewクラスは、メンバー変数としてTinyClockViewクラスを持つ。
- TinyAnalogClockViewクラスのdraw_viewメソッドは、アナログ時計を描画する。
- ソースコードの詳細はTinyClockViewGUI.pyを参照。
1 | class TinyAnalogClockView(QtGui.QWidget): |
mainwindow.py Pythonソースコード
- GUI部分はQtを利用している。Qt Creatorを利用している。
- Qt Creatorでフォームをデザインするとmainwindow.uiが作成される。
- mainwindow.uiはXMLである。
- mainwindow.uiからmainwindow.pyのPythonソースコードに変換した。
- Mac OSXでは以下のコマンドで変換可能。
- %/Library/Python/2.7/site-packages/PyQt4/uic/pyuic.py -o mainwindow.py mainwindow.ui
TinyClockMain_gui Pythonソースコード
- Subjectクラスのattachメソッドで、時計本体部と表示部を接続している。
- タイマーを設定し、以下を実行する。
- 時刻設定
- デジタル時計再描画
- アナログ時計再描画
- ソースコードの詳細はTinyClockMain_gui.pyを参照。
1 | class ClockViewWidget(QtGui.QMainWindow, Ui_MainWindow): |