Kotlin Observerパターン

別のクラスでとある処理をハンドリングしたい時、Observerパターンを利用すると良いでしょう。 この記事ではObseverパターンの解説と使い方を解説していきます。



目次

  1. Observerパターンとは
  2. Observerを作成する
  3. Subjectを作成する
  4. Observerを登録する


Observerパターンとは

観察する側(Observer)とされる側があり、監視されている側(Subject)に変化があるとそれをハンドリングして観察している側のクラスがある処理を行える様にする仕組みです。

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 コメント