前言
1. java自带的观察者
在这里就直接使用java自带的被观察者和观察者,Observable和Observer;
2. 具体代码如下
1>:让具体的被观察者,直接继承 系统 java自带的 Observable
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:12
* Version 1.0
* Params:
* Description: 具体的被观察者 - 鸿阳的微信公众号
*/
public class WXAdvanceObservable extends Observable {
private String article ;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
// 通知更新,推送给微信用户
// update(article);
// 通知更新,推送给微信用户
// 有更新,就设置改变
setChanged();
notifyObservers(article);
}
}
2>:IWXUser,观察者,微信用户
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:06
* Version 1.0
* Params:
* Description: 微信用户 - 订阅该微信公众号
*/
public interface IWXUser {
/**
* 读文章
*/
void push(String article) ;
}
3>:WXUser,具体的观察者,Novate、wangziwen,直接继承Observer ;
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:14
* Version 1.0
* Params:
* Description: 具体的用户 - 订阅鸿阳的微信公众号
* 这个类不用了,直接用系统 java自带的 Observer
*/
public class WXUser implements Observer {
private String name ;
public WXUser(String name){
this.name = name ;
}
/*@Override
public void push(String article) {
System.out.println(name+"收到了一篇文章:"+article);
}*/
/**
* 推拉模式的结合 - 既可以推又可以拉
* @param o :具体的被观察者,具体的公众号,WXAdvanceObservable
* @param arg :推送的文章,article
*/
@Override
public void update(Observable o, Object arg) {
System.out.println(name + " 收到了一篇推送的文章:" + arg);
WXAdvanceObservable advanceObservable = (WXAdvanceObservable) o;
System.out.println(name + " 主动拉取一篇文章:" + advanceObservable.getArticle());
}
}
4>:测试代码如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:16
* Version 1.0
* Params:
* Description:
*/
public class Client {
public static void main(String[] args){
// 具体的被观察者 - 微信公众号 - 鸿阳的公众号
WXAdvanceObservable wxAdvanceObservable = new WXAdvanceObservable() ;
// 具体的观察者 - 微信公众号 - Novate
WXUser novate = new WXUser("novate") ;
WXUser wangziwen = new WXUser("wangziwen") ;
// 微信公众号 - 用户订阅公众号
wxAdvanceObservable.addObserver(novate);
wxAdvanceObservable.addObserver(wangziwen);
// 微信公众号 - 推送文章
wxAdvanceObservable.setArticle("《观察者设计模式 - 定义及事例代码》");
// 微信公众号 - 用户取消订阅公众号
wxAdvanceObservable.deleteObserver(wangziwen);
}
}
3. 使用java自带被观察者与自己定义的被观察者区别?
自己定义的被观察者:需要自己手动写被观察者,然后让具体的被观察者继承;
使用java自带的被观察者:直接继承java自带的被观察者 Observable、Observer即可;