订阅者(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),则需要二次封装。