JDK原生发布订阅 Observer Observable

        订阅者(Observer),例如微信用户。

        被订阅者(Observable),例如微信。

import java.util.Observable;
import java.util.Observer;

/**
 * WeChat user
 * @author renqing
 *
 * Jul 24, 2022
 */
public class UserWx implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("用户收到了广告----> "+arg.toString());
	}

}
import java.util.Observable;
import java.util.Observer;

/**
 * WeChat
 * @author renqing
 *
 * Jul 24, 2022
 */
public class Wechat extends Observable {

	/**
	 * enable to be observed ability
	 * @param o
	 */
	public void beObserved(Observer o) {
		this.addObserver(o);
	}
	
	public void sendAd(String adContent) {
        // set changed = true
		this.setChanged();
        // callback observable objects
		this.notifyObservers(adContent);
	}
}
public class Test {

    public static void main(String[] args) throws InterruptedException {
		
    	// Observable object instance
    	Wechat wx = new Wechat();
    	
    	// Observer object instance
		UserWx user = new UserWx();
		
		// add Observer reference
		wx.addObserver(user);
		
		while(true) {
			Thread.sleep(2000);
			wx.sendAd("来自公众号的推送...");
		}
		
	}
}
运行结果:
用户收到了广告----> 来自公众号的推送...
用户收到了广告----> 来自公众号的推送...
用户收到了广告----> 来自公众号的推送...
用户收到了广告----> 来自公众号的推送...
用户收到了广告----> 来自公众号的推送...

        Observable对象里维护了一个Observer的Vector列表,在this.addObserver()时,会把Observer添加到列表中,值得注意的是添加时会判断是否已存在,判断的依据是Object.equals。

        使用场景是以单个订阅为主(一个topic对应多个consumer),如果有多个topic则需要创建多个Observable实例,相当于每个topic就是一个WeChat对象。

        如果想让一个WeChat对象能支持多个topic订阅(实际上是多个tag),则需要二次封装。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值