【设计模式】观察者模式(Observer)

观察者模式

  • 观察者模式的定义:
    1. 指多个对象间存在一对多的依赖关系,当一个对象发生改变时,所有依赖他的对象都会得到通知并自动更新。
    2. 这种模式又被称为发布—订阅模式、模型—视图模式,它是对象行为型模式。
  • 观察者模式的优点:
    降低目标与观察者之间的耦合关系,两者是抽象耦合关系。

利用观察者模式设计一个学校铃声处理系统

1.自定义观察者模式实现

//定义铃对象
class BellEvent {
    
    
    private val listeners = ArrayList<BellEventListener>()

    fun addListener(listener: BellEventListener) {
    
    
        listeners.add(listener)
    }

    fun ring() {
    
    
        notifyObserver()
    }

    private fun notifyObserver() {
    
    
        for (listener in listeners) {
    
    
            listener.update()
        }
    }

}

//定义铃声接口
interface BellEventListener {
    
    
    fun update()
}

//实现铃声对象
class Student : BellEventListener {
    
    
    override fun update() {
    
    
        println("学生:上课")
    }
}

class Teacher : BellEventListener {
    
    
    override fun update() {
    
    
        println("老师:上课")
    }
}

	//测试类
    private fun test() {
    
    
        val bell = BellEvent()
        bell.addListener(Student())
        bell.addListener(Teacher())
        //
        bell.ring()
    }
    //测试结果
   	//I/System.out: 学生:上课
   	//I/System.out: 老师:上课

2.使用Java中自带的Observable类和Observer接口

  • 在Java中,通过Observable类、Observer接口,定义了观察者模式,只要实现它们的子类就可以实现观察者模式。
import java.util.*

//定义被观察者
class Bell : Observable() {
    
    
    //通知所有观察者
    fun ring() {
    
    
        //设置状态改变
        super.setChanged()
        //可以传入参数arg,super.notifyObservers(1)
        super.notifyObservers()
    }
}

//观察者,师生
class Student : Observer {
    
    
    override fun update(o: Observable?, arg: Any?) {
    
    
        println("学生:上课")
    }
}

class Teacher : Observer {
    
    
    override fun update(o: Observable?, arg: Any?) {
    
    
        println("老师:上课")
    }
}
	
	//测试类
    private fun test() {
    
    
        val bell = Bell()
        bell.addObserver(Student())
        bell.addObserver(Teacher())
        //铃声响
        bell.ring()
    }
    //测试结果
    //I/System.out: 老师:上课
    //I/System.out: 学生:上课

参考资料

猜你喜欢

转载自blog.csdn.net/yu540135101/article/details/117066019