观察者模式(以jdk自带的为例)
核心类:
1 目标观察类Observable
里面两个最重要的变量:
- changed:观察目标状态是否变更,默认为:false;
- obs:观察者列表(observers),一个线程安全的列表集合:Vector,默认为空集合
2 观察者类接口Observer
-
里边只有一个实现接口 update
public interface Observer { /** * This method is called whenever the observed object is changed. An * application calls an <tt>Observable</tt> object's * <code>notifyObservers</code> method to have all the object's * observers notified of the change. * * @param o the observable object. * @param arg an argument passed to the <code>notifyObservers</code> * method. */ void update(Observable o, Object arg); }
实战:以发布消息以及接受消息为例
1 新增目标观察类 (继承Observable)
setChanged():设置变化值(默认是false)
notifyObservers(): 遍历所有的消息(addObserver操作后加入列表中)并调用 Observer的update(下文中有提到)方法
package org.jeecg.modules.scenecheck;
import lombok.Data;
import org.springframework.stereotype.Service;
import java.util.Observable;
/**
* @author Administrator
*/
@Data
@Service
public class JavaStackObservable extends Observable {
private String article;
//发布文章的方法
public void publish(String article) {
this.article = article;
/**设置为发生了变化 也就是有消息进来**/
this.setChanged();
/**这个方法会判断有变化
* 如果为false原路返回
* 如果true的话会遍历所有加入(addObserver)的对象,然后调用 Observer的update方法
* **/
this.notifyObservers();
}
}
2.创建观察者类(可以理解为订阅方)
实现了Observer接口 有个update的方法
@RequiredArgsConstructor为lombok的构造方法
package org.jeecg.modules.scenecheck;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import java.util.Observable;
import java.util.Observer;
/**
* @author lh
*/
@RequiredArgsConstructor
public class ReaderObserver implements Observer {
@NonNull
private String name;
private String article;
@Override
public void update(Observable o, Object arg) {
updateArticle(o);
}
private void updateArticle(Observable o){
JavaStackObservable javaStackObservable =(JavaStackObservable) o;
this.article = javaStackObservable.getArticle();
System.out.printf("我是读者:%s,文章已更新为:%s\n", this.name, this.article);
}
}
3.发布消息测试
调用addObserver的方法会将消息体加入到obs列表中(notifyObservers会监听是否有消息并且遍历后执行Observe的update的方法)
@ApiOperation(value = "测试", notes = "测试")
@PostMapping(value = "/look")
public void look() {
JavaStackObservable javaStackObservable = new JavaStackObservable();
javaStackObservable.addObserver(new ReaderObserver("嘻嘻"));
javaStackObservable.addObserver(new ReaderObserver("哈哈"));
javaStackObservable.addObserver(new ReaderObserver("小波"));
javaStackObservable.addObserver(new ReaderObserver("天线"));
javaStackObservable.publish("观察者入门模式学习");
}
输出结果为:
我是读者:天线,文章已更新为:观察者入门模式学习
我是读者:小波,文章已更新为:观察者入门模式学习
我是读者:哈哈,文章已更新为:观察者入门模式学习
我是读者:嘻嘻,文章已更新为:观察者入门模式学习