open interface Observer {
fun update(obj: Object)
}
創(chuàng)建觀察者基類
open abstract class Subject {
//被觀察者的集合
protected val subjectList = arrayListOf<Observer>()
//注冊被觀察者昔案,添加到集合
abstract fun register(observer:Observer)
//刪除集合
abstract fun unRegister(observer: Observer)
//發(fā)送消息
abstract fun notifyObservers(obj: Object)
}
具體觀察者實現(xiàn)方法,這里kotlin已經(jīng)實現(xiàn)了單例
object ConcreteSubject : Subject() {
override fun register(observer: Observer) {
subjectList.add(observer)
}
override fun unRegister(observer: Observer) {
subjectList.remove(observer)
}
//調(diào)用集合所有的方法并調(diào)用
override fun notifyObservers(obj: Object) {
for (observer in subjectList) {
observer.update(obj)
}
}
}
發(fā)送消息頁面
class TestActivity :AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_text)
button.setOnClickListener {
finish()
//發(fā)送消息
ConcreteSubject.notifyObservers("text發(fā)送的消息" as Object)
}
}
}
接收消息尿贫,注冊,取消注冊踏揣,這里必須取消注冊 否則會出現(xiàn)內(nèi)存泄漏
class MainActivity : AppCompatActivity() ,Observer{
@RequiresApi(Build.VERSION_CODES.KITKAT)
override fun update(obj: Object) {
tv.setText(obj as String)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ConcreteSubject.register(this)
button.setOnClickListener {
startActivity(Intent(this,TestActivity::class.java))
}
}
override fun onDestroy() {
super.onDestroy()
ConcreteSubject.unRegister(this)
}
}
class MainActivity : AppCompatActivity() ,Observer{
@RequiresApi(Build.VERSION_CODES.KITKAT)
override fun update(obj: Object) {
tv.setText(obj as String)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
ConcreteSubject.register(this)
button.setOnClickListener {
startActivity(Intent(this,TestActivity::class.java))
}
}
override fun onDestroy() {
super.onDestroy()
ConcreteSubject.unRegister(this)
}
}