基于Java使用观察者模式

系列文描述:

  该文章是日常笔记系列的第二篇,此乃第一节,主要记录了开发中如何基于Java使用观察者模式,相信看完肯定有所收获。

基于Java实现观察者模式

作用描述:

在日常研发过程总会遇见业务A随着业务B发生相关变化的情况,这种情况便可以运用观察者模式,而对于观察者模式,Java已经为我们提供了已有的接口和类方便我们使用。

对于订阅者Java为我们提供了一个接口,JDK源码如下:

 
  1. public interface Observer {
  2.         void update(Observable var1, Object var2);
  3.     }

可以看出,此处仅提供一个update方法用于接收通知者的通知做出相应改变。 在实际业务中,实现观察者模式的订阅者只需要实现该接口并实现update接口实现业务即可。

场景代码如下:

订阅者.png

update.png

再来看看Java提供了一个怎样的通知者,可以看到JDK源码如下:           

 
  1. public class Observable {
  2.     private boolean changed = false;
  3.     //  存放Observer的容器,本身是安全的,看了源码,内部实现的大部分函数都使用了synchronized
  4.     private Vector<Observer> obs = new Vector();
  5.  
  6.     public Observable() {
  7.     }
  8.     // 为通知者添加订阅者的地方
  9.     public synchronized void addObserver(Observer var1) {
  10.         if (var1 == null) {
  11.             throw new NullPointerException();
  12.         } else {
  13.             if (!this.obs.contains(var1)) {
  14.                 this.obs.addElement(var1);
  15.             }
  16.  
  17.         }
  18.     }
  19.  
  20.     public synchronized void deleteObserver(Observer var1) {
  21.         this.obs.removeElement(var1);
  22.     }
  23.  
  24.     public void notifyObservers() {
  25.         this.notifyObservers((Object)null);
  26.     }
  27.  
  28.     public void notifyObservers(Object var1) {
  29.         Object[] var2;
  30.         synchronized(this) {
  31.             if (!this.changed) {
  32.                 return;
  33.             }
  34.  
  35.             var2 = this.obs.toArray();
  36.             this.clearChanged();
  37.         }
  38.  
  39.         for(int var3 = var2.length - 1; var3 >= 0; --var3) {
  40.             ((Observer)var2[var3]).update(this, var1);
  41.         }
  42.  
  43.     }
  44.  
  45.     public synchronized void deleteObservers() {
  46.         this.obs.removeAllElements();
  47.     }
  48.  
  49.     protected synchronized void setChanged() {
  50.         this.changed = true;
  51.     }
  52.  
  53.     protected synchronized void clearChanged() {
  54.         this.changed = false;
  55.     }
  56.  
  57.     public synchronized boolean hasChanged() {
  58.         return this.changed;
  59.     }
  60.  
  61.     public synchronized int countObservers() {
  62.         return this.obs.size();
  63.     }
  64. }

首先我们可以从源码中看出Observable类使用Vector,Vector相比于ArrayList来说,它是线程安全的。其次,在多个函数上使用了synchronized关键字,这都是在为多线程考虑,避免出现在需要做出通知订阅者动作的时候因为数据紊乱出错的问题。 在实际业务中,直接继承该类即可,场景代码如下:

监听者.png

那么如何给监听者注册订阅者呢?场景代码如下:

注册操作.png

而监听者通知订阅者的操作如下:

通知.png

可以从上看出直接调用addObserver便可以给监听者注册订阅者,而在监听者发生变化的时候监听者调用setChange修改状态,之后调用notifyObservers通知,订阅者中的update实现便会被触发。

结尾说点什么

说好的一周一篇,上个周末沉迷docker的使用导致废了,然后最近又是每天都是差不多十二点下班,所以只能下班后花时间写总结最近的笔记了(  ̄▽ ̄)((≧︶≦)


系列博客可以关注公众号:

公众号.jpg

个人网站:http://myblog.lixifan.cn/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值