zoukankan      html  css  js  c++  java
  • Java中的观察者模式

    注:基于《Java高并发编程详解-汪文君》、《深入理解JVM高级特性与最佳实践-周志明》,以学习为目的,加上自身理解、验证。作为笔记,为加深印象,做到不复制,不粘贴。欢迎,大家一起交流学习。

    观察者模式

    又叫做发布-订阅模式。观察者模式定义了一种一对多的依赖关系。使得多个观察对象可以去监听到同一个主题对象,当其状态发生改变时,会通知到所有的观察者。

    观察者模式的结构

    1.抽象主题角色

    抽象主题角色把所有的观察者的引用保存在一起,每一个主题角色都可以有任意多个观察者。抽象主题角色踢狗一个操作的接口,可以增加或者删除观察者对象。

    2.具体主题角色

    在观察者对象中保存与其相关的状态,当具体的主题对象内部状态发生改变时,通知到所有注册的观察者对象,进行其自身内部状态的改变。

    3.抽象观察者角色

    提供一个操作接口,在具体主题角色状态发生改变时,更新具体观察者的状态。

    4.具体观察者角色

    保存和主题的状态相关的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态协调。

    观察者模式示例

    public interface Observer {
    
        void process(String event);
    
    }
    public class ObserverImpl implements Observer {
    
        public void process(String event) {
            System.out.println("观察者看到:" +event);
        }
    }
    public abstract class Subject {
    
        private List<Observer> list = new ArrayList<Observer>();
    
        // 加入观察者对象
        public void add(Observer observer) {
            list.add(observer);
        }
    
        // 移除观察者对象
        public void remove(Observer observer) {
            list.remove(observer);
        }
    
        // 当有事件发生时,通知所有观察者对象
        public void notifyObservers(String event) {
            for (int i = 0; i < list.size(); i++) {
                list.get(i).process(event);
            }
        }
    
    }
    public class SubjectImpl extends Subject {
    
        private String event;
    
        public String getEvent() {
            return event;
        }
    
        public void onEvent(String event)
        {
            this.event = event;
            System.out.println("发生事件:" + event);
            // 通知所有观察者
            this.notifyObservers(event);
        }
    
    }
    public class Main {
    
        public static void main(String[] args) {
    
            SubjectImpl subject = new SubjectImpl();
            Observer observer = new ObserverImpl();
            subject.add(observer);
            subject.onEvent("event say hello");
        }
    }

    运行结果:

    发生事件:event say hello
    观察者看到:event say hello

    观察者模式在Java中的应用java.util.Observer接口

     1 /**
     2  * A class can implement the <code>Observer</code> interface when it
     3  * wants to be informed of changes in observable objects.
     4  *
     5  * @author  Chris Warth
     6  * @see     java.util.Observable
     7  * @since   JDK1.0
     8  */
     9 public interface Observer {
    10     /**
    11      * This method is called whenever the observed object is changed. An
    12      * application calls an <tt>Observable</tt> object's
    13      * <code>notifyObservers</code> method to have all the object's
    14      * observers notified of the change.
    15      *
    16      * @param   o     the observable object.
    17      * @param   arg   an argument passed to the <code>notifyObservers</code>
    18      *                 method.
    19      */
    20     void update(Observable o, Object arg);
    21 }

    ...未完

    public class ObserverImpl implements Observer {

    public void process(String event) {
    System.out.println("观察者看到:" +event);
    }
    }
  • 相关阅读:
    jquery实现章节目录效果
    Delphi里如何让程序锁定在桌面上,win+d都无法最小化
    php 之跨域上传图片
    delphi判断文件类型
    EmptyRecycle() 清空回收站
    delphi检查url是否有效的方法
    Explode TArray
    css设置中文字体(font-family:"黑体")后样式失效问题
    javascript-lessons
    课后作业2
  • 原文地址:https://www.cnblogs.com/sunl123/p/11123942.html
Copyright © 2011-2022 走看看