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收到了目标变化,推模式,获取变化的内容天气转阴!

  • 相关阅读:
    linux 解压tgz 文件指令
    shell 脚本没有执行权限 报错 bash: ./myshell.sh: Permission denied
    linux 启动solr 报错 Your Max Processes Limit is currently 31202. It should be set to 65000 to avoid operational disruption.
    远程查询批量导入数据
    修改 MZTreeView 赋权节点父节点选中子节点自动选中的问题
    关于乱码的问题解决记录
    我的网站优化之路
    对设计及重构的一点反思
    我的五年岁月
    奔三的路上
  • 原文地址:https://www.cnblogs.com/lilin0719/p/5222172.html
Copyright © 2011-2022 走看看