Kotlin Observerパターン
別のクラスでとある処理をハンドリングしたい時、Observerパターンを利用すると良いでしょう。 この記事ではObseverパターンの解説と使い方を解説していきます。
目次
Observerパターンとは
観察する側(Observer)とされる側があり、監視されている側(Subject)に変化があるとそれをハンドリングして観察している側のクラスがある処理を行える様にする仕組みです。
Observerを作成する
一緒にinterfaceを作成しておくことで、処理を呼ぶ側がどのメソッドを呼べばいいのかを明確にしておきます。 以下の例では、ユーザーとマッチングした際に別のクラスでハンドリングが行える様な仕組みを作る場合です。
interface MatchingObserver {
fun matching()
}
class MainActivity() : AppCompatActivity(), MatchingObserver {
override fun matching() {
// todo...
}
}
Subjectを作成する
監視される側のSubjectクラスではObserverを配列として管理しておきます。
notifyObservers()
を呼ぶと観察者として登録されている全てのObserverの matching()
が呼ばれます。
class Subject() {
private val observers = mutableListOf<MatchingObserver>()
fun addObserver(observer: MatchingObserver) {
observers.add(observer)
}
fun removeObserver(observer: MatchingObserver) {
observers.remove(observer)
}
fun notifyObservers() {
observers.forEachIndexed { _, matchingObserver -> matchingObserver.matching() }
}
}
Observerを登録する
onCreate()
時に Observerをセットして onDestroy()
時にセットしたObserverを削除します。
lateinit var subject: Subject
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
subject = Subject()
subject.addObserver(this)
}
override fun onDestroy() {
super.onDestroy()
subject.removeObserver(this)
}
この様に設定しておけば後はSubjectクラス側の好きなタイミングで notifyObservers()
を呼ぶことで、
全てのObserverを登録したクラスでハンドリングが可能になります。
0 コメント