デザインパターンの1つであるObserverパターンについて自分なりにまとめてみました。
Observerパターンのクラス図
Observerパターンの解説
Subjectクラスが観測対象のクラスで、このクラスの属性にObserver型の配列を用意することがポイント。
Observerはinterfaceなので、これを実装しているObserver1,Observer2クラスはどちらもObserver型なので、この配列に追加できる。notifyメソッドでは、このObserver配列内のObserverオブジェクトの各updateメソッドを実行する。
これにより、Subject型のオブジェクトの属性が変更された場合のsetterメソッドなどで、notifyを実行すれば、Observerオブジェクトで実装しているupdateメソッドを呼び出すことができる。notifyの引数に自身(Subjectオブジェクト)を渡せば、その属性をupdateで変更させることもできる。
Observerパターンをどういう場合に使うか
例えばDBから取得したUserレコードを更新した際に、ログに残す、メール送信する、・・・・などの幾つかの処理がある場合に、Userオブジェクトの保存処理のタイミングでnotifyを実行する。
Observer配列属性には、LogObserver,MailObserverオブジェクトを設定しておき、書く処理を各クラスのupdateメソッドに実装する。
こうすると、例えばメール送信の処理を変更したりする場合にMailObserverクラスを修正すればよくなるし、他の処理を追加したければXXXObserverクラスを作ればよくなる。
ObserverパターンのPlantUMLの記述
文頭のObserverパターンのクラス図をPlantUMLで書いたときのソースです。
@startuml Observer Pattern
interface Observer{
+ {abstract} update()
}
class Observer1 implements Observer{
+ update()
}
class Observer2 implements Observer{
+ update()
}
class Subject{
- observers: Observer[]
--
+ notify(Subject sub) 内部でobserverのupdateを呼ぶ
+ attach(Observer obs)
+ detach(Observer obs)
}
class Subject1 extends Subject{
}
class Subject2 extends Subject{
}
Subject o-r--> Observer : hasMany >
@enduml
参考サイトURL
https://www.techscore.com/tech/DesignPattern/Observer.html https://shimooka.hateblo.jp/entry/20141218/1418888729