一、观察者模式定义:
定义了对象间一对多的组合关系,以便一个对象状态发生变化时,所有依赖于它的对象都得到通知,并自动刷新。简单点理解就是广播模式,一个对象发生了变化,通知所有依赖于它的对象,也做相应的调整,现在比较流行的zookeeper就是这种模式,还有我们平常订阅报纸,在工作平台找工作都有类似的模式。
二、观察者模式使用的场景:
1.一个对象的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2.对象仅需要将自己的更新通知到其他对象,不需要知道其他对象的细节。
三、观察者模式涉及的角色:
以报社为例子分析观察者模式。
1.Subject:抽象主题(抽象被观察者–报社抽象)
抽象主题角色把所有的观察者(订阅报纸的读者)保存在一个集合里(要只要谁订阅了报纸,总不能到时候乱发吧),每个主题都可以有任意数量的观察者(同一种报纸可以被N个人订阅)。抽象主题提供一个接口,可以增加和删除观察者对象(允许新增订阅的人,也要允许人家退订)。
2.concreteSubject:具体主题(具体的被观察者–具体的商报或者新闻报等实体)
该角色将有关状态存入具体观察对象(即要将报纸的信息给订阅者),在具体主题内部发生变化时(有新一期的报纸时),通知到各个观察者(将报纸发给每一位订阅者)
3.Observer:抽象观察者(对所有订阅者的抽象)
是观察者的抽象类,它定义了一个更新接口(收件箱),使得主题改变时通知自己更新(能够收到报纸)
4.concreteObserver:具体观察者(订阅者实体)
实现抽象类定义的更新接口,以便再收到通知时更新自己的状态(建立自己的邮箱,收到报纸以后可以选择阅读或者装B)
四、观察者的实现
java中jdk有自带的观察者模式的接口和父类,抛开先不说,自己实现一个简单的观察者模式,不考虑性能,线程安全等。
1.抽象主题,从角色定义可以确定需要的基本方法和变量:
需要一个存储所有观察者的容器、需要一个添加新的观察者的方法、需要一个移除订阅者的方法、需要一个通知所有观察者的接口。根据这些需求,定义一个观察者的抽象类–即父类
java设计模式(四)---观察者模式
2.抽象观察者,从角色定义可以发现,只需要一个接收通知的接口:
java设计模式(四)---观察者模式
3.具体主题,具体被观察者,从角色定义出发:
需要一个发生变化的方法,需要通知所有的观察者
java设计模式(四)---观察者模式
4.具体观察者,只需要在被观察者发生变化的时候收到消息,并做相应的操作即可
java设计模式(四)---观察者模式

5.能不能实现,还是要走一把:
java设计模式(四)---观察者模式
可以添加多个观察者,都会发生对应的变化
五、java自带观察者模式
java设计模式(四)---观察者模式
实现更细节
java设计模式(四)---观察者模式
多了参数传递,可以获取更多信息

使用方式与这种简单的一样,不过功能更强大,线程安全

相关文章:

  • 2021-06-01
  • 2021-10-29
  • 2021-10-23
  • 2021-12-19
  • 2021-10-01
  • 2021-12-21
  • 2021-12-27
  • 2022-12-23
猜你喜欢
  • 2021-07-26
  • 2022-12-23
  • 2021-09-03
  • 2022-01-01
  • 2021-06-26
  • 2021-06-25
相关资源
相似解决方案