Observerパターン(状態変化を観測するデザインパターン)をクラス図にまとめる

デザインパターン

デザインパターンの1つであるObserverパターンについて自分なりにまとめてみました。

Observerパターンのクラス図

PlantUMLで作成

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