zoukankan      html  css  js  c++  java
  • 观察者模式学习--使用jdk的工具类简单实现

    观察者模式学习之二:使用jdk的自带的工具类实现,与自己实现相比,两者有以下的区别:

    1,自己实现,需要定义观察者的接口类和目标对象的接口类。使用java util的工具类,则不需要自己定义观察者和目标对象的接口类了,jdk已经定义好了。

    2,自己实现,具体的目标对象类中,实现了接口方法后,还必须要自己实现维护观察者的注册删除信息。但是使用jdk,则不需要了,在

    jdk的util下的observable类里面已经帮忙维护好了。

    3,目标对象触发观察者的update的通知方式有了变化,自己的实现,只要定义好触发方法,调用观察者的接口的update方法就好了。使用jdk则必须要先先调用setChange()方法,否则,不会触发通知,通知观察者变化。这是java为了帮助实现更加精准的触发控制而提供的功能方法。

    4,具体的观察者类的实现中,update方法有区别,自己实现的,需要按照自己的需要定义好是按照推模式,还是拉模式,定义update的方法参数。但是 使用jdk,则update的方法中包含了传送的参数和目标对象的引用。能够同时满足推模式和拉模式的实现。

    下面具体的代码实现:

    首先是具体的目标对象的实现类,其中包含了部分的自己的测试代码:

    public class MySubject extends Observable {
        // 目标的内容
        private String sujectContent;
    
        public String getSujectContent() {
            return sujectContent;
        }
    
        public void setSujectContent(String sujectContent) {
            this.sujectContent = sujectContent;
            // 是用jdk 必须要先调用此方法。
            setChanged();
            // 通知观察则变化 拉模式
            // notifyObservers();
            // 通知观察则变化 推模式
            notifyObservers(sujectContent);
        }
    
    }

    然后,用jdk,实现具体的观察者实现类:同样包含了部分的测试代码:其中注明了 推模式  和 拉模式的分别的实现方式。

    public class MyObserver implements Observer {
    
        private String observerName;
    
        @Override
        public void update(Observable o, Object arg) {
            MySubject subject = (MySubject) o;
            System.out.println(observerName + "收到了目标变化,拉模式,获取变化的内容"
                    + subject.getSujectContent());
    
            System.out.println(observerName + "收到了目标变化,推模式,获取变化的内容" + arg);
        }
    
        public String getObserverName() {
            return observerName;
        }
    
        public void setObserverName(String observerName) {
            this.observerName = observerName;
        }
    
    }

    最后写下,简单的测试类:测试结果的正确性:创建两个观察者,分别在目标对象中注册,目标对象发生变化,通知两个观察者实时更新。

    /**
     * @author lilin
     * 
     */
    public class ObserverTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            MySubject subject = new MySubject();
            MyObserver observer = new MyObserver();
            observer.setObserverName("观察者1");
    
            MyObserver observer2 = new MyObserver();
            observer2.setObserverName("观察者2");
            // 注册观察者
            subject.addObserver(observer);
            subject.addObserver(observer2);
            // 目标发生变化,通知观察者更新
            subject.setSujectContent("天气转阴!");
        }
    
    }

    测试结果如下展示:

    观察者2收到了目标变化,拉模式,获取变化的内容天气转阴!
    观察者2收到了目标变化,推模式,获取变化的内容天气转阴!
    观察者1收到了目标变化,拉模式,获取变化的内容天气转阴!
    观察者1收到了目标变化,推模式,获取变化的内容天气转阴!

  • 相关阅读:
    [DFNews] Nuix公司推出培训及认证体系
    [CFNews] Oxygen官方对于新版XRY与之冲突问题的官方解释
    [DFNews] FBI Documents Shine Light on Clandestine Cellphone Tracking Tool
    [CFNews] Be first to get Oxygen Forensic Suite 5.0 just before the End of the World!
    [DFNews] CelleBrite发布2013年移动设备取证趋势与预测白皮书
    [转载] Retrieving Data from an iPhone Voicemail Database
    [转载] 我们从未改变:弱密码仍是最常用的密码
    [DFNews] US students get cracking on Chinese malware code
    [转载] 25GPU cluster cracks every standard Windows password in <6 hours
    [手机取证] Forwarding SMS to Email on [Jailbroken] iOS
  • 原文地址:https://www.cnblogs.com/lilin0719/p/5222172.html
Copyright © 2011-2022 走看看