扩展阅读
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 我想学Java,但不知道Java的实用的开发工具有那些,Java主要用在哪些方面,EJB到底是什么东西??
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • redhat7.3下,java程序打印中文直接用java命令执行正常,用crontab执行java命令为乱码
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javafilelistflavor定义及介绍
  • 各位学java的朋友,学java的未来是什么,你们学java都用来开发什么项目啊!来者给分!!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getvmname定义及介绍
  • 请问java程序中的import为什么有的用java.….*,而有的又用java.….…,有什么区别吗?
  •  
    当前位置:  编程语言>java/jsp

    java观察者模式概念及相关类介绍

     
        发布时间:2014-1-13  


        本文导语: 1、 观察者模式概念 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,让他们自动更新自己。2. 相关类介绍 1)Obervabl...

    1、 观察者模式概念
       观察者模式定义了一种一对多的依赖关系,让多个观察者php开源软件 iis7站长之家同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,让他们自动更新自己。

    2.  相关介绍

    1)Obervable类

      此类表示模型视图范例中的 observable 对象,继承它的类表示应用程序想要观察的对象。一个 observable 对象可以有一个或多个观察者。观察者是实现Observer接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。

    方法摘要

    void  addObserver(Observer o)

        如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。未指定向多个观察者发送通知的顺序

    protected  void  clearChanged()

        指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。notifyObservers 方法自动调用此方法。

    int  countObservers()

         返回 Observable 对象的观察者数目。

    void  deleteObserver(Observer o)

         从对象的观察者集合中删除某个观察者。向此方法传递 null无效。

    void  deleteObservers()

         清除观察者列表,使此对象不再有任何观察者。

    boolean hasChanged()

          测试对象是否改变。当且仅当在此对象上最近调用了 setChanged 方法时才返回 true;否则返回 false

    void  notifyObservers()

          如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 null。换句话说,此方法等效于:

    notifyObservers(null).

    void notifyObservers(Object arg)

        如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 arg 参数。 arg 可以是任意对象.

    protected  void  setChanged()

             标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。


    关于发送通知的顺序:

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

    注意:此通知机制与线程无关,并且与 Object 类的 waitnotify 机制完全独立。新创建一个 observable 对象时,其观察者集是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。

    3、观察者模式的组成:可以概括为两个抽象和两个具体。
    - 抽象主题(Subject)角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
    - 抽象观察者(Observer)角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
    - 具体主题角(ConcreteSubject)色:在具体主题角色内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常由一个子类来实现。
    - 具体观察者(ConcreteObserver)角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类来实现。
    代码举例如下:

    //抽象主题角色:
    //抽象主题角色
    public interface Subject
    {
        //注册观察者对象
        public void addWatcher(Observer watcher);
                            
        //删除观察者对象
        public void removeWatcher(Observer watcher);
                            
        //通知所有的观察者对象
        public void notifyWatchers(String str);
    }
    //具体主题角色:
    //具体主题角色
    public class ConcreteSubject implements Subject
    {
        //把所有对观察者对象的引用保存在一个集合中
        private List list = new ArrayList();@Overridepublic void addWatcher(Observer watcher){list.add(watcher);}@Overridepublic void removeWatcher(Observer watcher){list.remove(watcher);}@Overridepublic void notifyWatchers(String str){for(Observer watcher : list){watcher.update(str);}}}
    //抽象观察者角色:
    //抽象观察者角色
    public interface Observer
    {
        public void update(String str);
    }
    //具体观察者对象:
    //具体观察者对象
    public class ConcreteObserver implements Observer
    {
        @Override
        public void update(String str)
        {
            System.out.println(str);
        }
    }
    //测试类:
    public class TestObserver
    {
        public static void main(String[] args)
        {
            //相当于GUI中一个按钮
            Subject watched = new ConcreteSubject();
                                
            //相当于按钮的事件监听器
            Observer watcher1 = new ConcreteObserver();
            Observer watcher2 = new ConcreteObserver();
            Observer watcher3 = new ConcreteObserver();
                                
            //将监听器注册到主题角色中
            watched.addWatcher(watcher1);
            watched.addWatcher(watcher2);
            watched.addWatcher(watcher3);
                                
            //在单击按钮后,触发了事件
            watched.notifyWatchers("hello");
            System.out.println("-----------");
                                
            watched.removeWatcher(watcher1);
            watched.notifyWatchers("world");
        }
    }

    4、总结

      javaGUI编程中大量使用了观察者模式,在jdk中也提供了对观察者模式的支持,它们在java.util包中的Obserable类和Observer接口,其中的实现思路与上面的代码大体相同,所以在理解了上面简单代码的基础上,再去研究jdk对观察者模式所提供的源码就不是什么难事了。                    



    • 本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
      本站(WWW.)站内文章除注明原创外,均为转载,整理或搜集自网络.欢迎任何形式的转载,转载请注明出处.
      转载请注明:文章转载自:[169IT-IT技术资讯]
      本文标题:java观察者模式概念及相关类介绍
    相关文章推荐:


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3