Java JDK 观察者模式

subject -> java.util.Observable(类)

void addObserver(Observer o)   
          如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。   
protected  void clearChanged()   
          指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。   
int countObservers()   
          返回 Observable 对象的观察者数目。   
void deleteObserver(Observer o)   
          从对象的观察者集合中删除某个观察者。   
void deleteObservers()   
          清除观察者列表,使此对象不再有任何观察者。   
boolean hasChanged()   
          测试对象是否改变。   
void notifyObservers()   
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。   
void notifyObservers(Object arg)   
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。   
protected  void setChanged()   
          标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。  

observer -> java.util.Observer(接口)

void update(Observable o, Object arg)   
          只要改变了 observable 对象就调用此方法。

setChanged()、chearChanged()和hasChanged()这3个方法:


参见上面Observable类的notifyObservers(Object arg)方法,hasChanged()为true才会通知观察者数据有变化,并且在通知完成之后调用clearChanged()修改hasChanged()为false,所以当主题数据改变时,需要先调用setChanged()方法使hasChanged为true

Observable的伪码应该如下所示:

public class Observable {  
    private boolean flag = false;  
    private List<Observer> list = new ArrayList<Observer>();  
      
    public boolean hasChanged(){  
        return flag;  
    }  
      
    protected void setChanged(){  
        flag = true;  
    }  
  
    protected void clearChanged(){  
        flag = false;  
    }  
      
    public void addObserver(Observer o){  
        if(!list.contain(o)){  
            list.add(o);  
        }  
    }  
      
    public void deleteObserver(Observer o){  
        if(list.contain(o)){  
            list.remove(o);  
        }  
    }  
      
    public void notifyObservers(Object arg){  
        if(hasChanged()){  
            if(null != list && list.size > 0){  
                for(Observer o : list){  
                    o.update(this, arg);  
                }  
            }  
        }  
        clearChanged();  
    }  
}  

类 Observable

此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察的对象。

一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 ObservablenotifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。

未指定发送通知的顺序。Observable 类中所提供的默认实现将按照其注册的重要性顺序来通知 Observers,但是子类可能改变此顺序,从而使用非固定顺序在单独的线程上发送通知,或者也可能保证其子类遵从其所选择的顺序。

注意,此通知机制与线程无关,并且与 Object 类的 waitnotify 机制完全独立。

新创建一个 observable 对象时,其观察者集是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。

构造方法

Observable()

          构造一个带有零个观察者的 Observable。

方法摘要

 voidaddObserver(Observer o)
          如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。
protected  voidclearChanged()
          指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false
 intcountObservers()
          返回 Observable 对象的观察者数目。
 voiddeleteObserver(Observer o)
          从对象的观察者集合中删除某个观察者。
 voiddeleteObservers()
          清除观察者列表,使此对象不再有任何观察者。
 booleanhasChanged()
          测试对象是否改变。
 voidnotifyObservers()
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
 voidnotifyObservers(Object arg)
          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。
protected  voidsetChanged()
          标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

接口 Observer

一个可在观察者要得到 observable 对象更改通知时可实现 Observer 接口的类。 

方法摘要
 voidupdate(Observable o, Object arg)
          只要改变了 observable 对象就调用此方法。

方法详细信息

update

void update(Observable o,
            Object arg)
只要改变了 observable 对象就调用此方法。应用程序调用 Observable 对象的 notifyObservers 方法,以便向所有该对象的观察者通知此改变。

参数:
o - observable 对象。
arg - 传递给 notifyObservers 方法的参数。


使用jdk自带的观察者模式的缺点:



1,Observable是一个类,而不是一个接口,导致Observable类的扩展性不高,不如自己实现的观察者模式灵活


2,Observable将某些方法保护了起来(setChanged()和clearChanged()为protected),这意味着除非继承自Observable,否则将有关键的方法不能调用。导致无法通过组合的方式使其它类获得Observable类的功能



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值