观察者模式(以jdk自带的为例)

观察者模式(以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操作后加入列表中)并调用 Observerupdate(下文中有提到)方法

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("观察者入门模式学习");
}

输出结果为:

我是读者:天线,文章已更新为:观察者入门模式学习
我是读者:小波,文章已更新为:观察者入门模式学习
我是读者:哈哈,文章已更新为:观察者入门模式学习
我是读者:嘻嘻,文章已更新为:观察者入门模式学习

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值