前言
观察者设计模式系列文章:
观察者设计模式(一) - 定义、角色划分、示例代码
观察者设计模式(二) - 推拉模式
观察者设计模式(三) - Java自带的观察者
观察者设计模式(四) - 源码中观察者设计模式的使用场景
1. 什么是推拉模式?
比如我们订阅的公众号:
- 推送模式(push模式):比如订阅号有文章更新,主动推送一篇文章;
- 拉模式(pull模式):如果我觉得有的文章真的很不错,我想主动去看看该文章;
- 推拉模式结合:推模式 + 拉模式,既可以收到文章的推送,也可以自己主动拉取文章来阅读;
2. 推模式与拉模式区别?
推模式:被动的,由公众号推送过来的;
拉模式:主动的,自己主动去看文章的;
3. pull拉模式示例代码如下:
1>:PullWXPublicObservable,被观察者,微信公众号
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:03
* Version 1.0
* Params:
* Description: 微信公众号 - 多个人去订阅的公众号
*/
public class PullWXPublicObservable {
// 所有订阅用户的集合
private List<IPullWXUser> mWXUsers ;
public PullWXPublicObservable(){
mWXUsers = new ArrayList<>() ;
}
/**
* 订阅
*/
public void register(IPullWXUser wxUser){
mWXUsers.add(wxUser) ;
}
/**
* 取消订阅
*/
public void unregister(IPullWXUser wxUser){
mWXUsers.remove(wxUser) ;
}
/**
* 文章更新
*/
public void update(String article){
// 推送所有更新的文章
for (IPullWXUser wXUser : mWXUsers) {
wXUser.pull(this);
}
}
}
2>:PullWXAdvanceObservable,具体的被观察者 - 鸿阳的微信公众号;
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:12
* Version 1.0
* Params:
* Description: 具体的被观察者 - 鸿阳的微信公众号
*/
public class PullWXAdvanceObservable extends PullWXPublicObservable {
private String article ;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
// 通知更新,推送给微信用户
update(article);
}
}
3>:IPullWXUser,观察者,微信用户
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:06
* Version 1.0
* Params:
* Description: 微信用户 - 订阅该微信公众号
*/
public interface IPullWXUser {
/**
* 把公众号给用户
*/
void pull(PullWXPublicObservable wxObservable) ;
}
4>:PullWXUser,具体的观察者,Novate,wangziwen
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:14
* Version 1.0
* Params:
* Description: 具体的用户 - 订阅鸿阳的微信公众号
*/
public class PullWXUser implements IPullWXUser {
private String name ;
public PullWXUser(String name){
this.name = name ;
}
@Override
public void pull(PullWXPublicObservable wxPublicObservable) {
// 拉模式 - 主动的从公众号中拉取一篇文章
PullWXAdvanceObservable advanceObservable = (PullWXAdvanceObservable) wxPublicObservable;
System.out.println(name+"主动拉取一篇文章:"+advanceObservable.getArticle());
}
}
5>:测试代码如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 16:03
* Version 1.0
* Params:
* Description:
*/
public class Client {
public static void main(String[] args){
// 具体的被观察者 - 微信公众号 - 鸿阳的公众号
PullWXAdvanceObservable wxAdvanceObservable = new PullWXAdvanceObservable() ;
// 具体的观察者 - 微信公众号 - Novate
PullWXUser novate = new PullWXUser("novate") ;
PullWXUser wangziwen = new PullWXUser("wangziwen") ;
// 微信公众号 - 用户订阅公众号
wxAdvanceObservable.register(novate);
wxAdvanceObservable.register(wangziwen);
// 微信公众号 - 推送文章
wxAdvanceObservable.setArticle("《观察者设计模式 - 定义及事例代码》");
// 微信公众号 - 用户取消订阅公众号
wxAdvanceObservable.unregister(wangziwen);
}
}
运行结果如下图所示:
4. push推模式示例代码如下:
push推模式和上一节的示例代码一模一样,只是修改下名字就可以
1>:PushWXPublicObservable,被观察者,微信公众号
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:12
* Version 1.0
* Params:
* Description: 具体的被观察者 - 鸿阳的微信公众号
*/
public class PushWXAdvanceObservable extends PushWXPublicObservable {
private String article ;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
// 通知更新,推送给微信用户
update(article);
}
}
2>:PushWXAdvanceObservable,具体的被观察者,鸿阳的微信公众号
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:12
* Version 1.0
* Params:
* Description: 具体的被观察者 - 鸿阳的微信公众号
*/
public class PushWXAdvanceObservable extends PushWXPublicObservable {
private String article ;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
// 通知更新,推送给微信用户
update(article);
}
}
3>:IPushWXUser,观察者,微信用户
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:06
* Version 1.0
* Params:
* Description: 微信用户 - 订阅该微信公众号
*/
public interface IPushWXUser {
/**
* 读文章
*/
void push(String article) ;
}
4>:PushWXUser,具体的观察者,Novate、wangziwen;
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/27 15:14
* Version 1.0
* Params:
* Description: 具体的用户 - 订阅鸿阳的微信公众号
*/
public class PushWXUser implements IPushWXUser {
private String name ;
public PushWXUser(String name){
this.name = name ;
}
@Override
public void push(String article) {
System.out.println(name+"收到了一篇文章:"+article);
}
}
5>:测试代码如下:
/**
* 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){
// 具体的被观察者 - 微信公众号 - 鸿阳的公众号
PushWXAdvanceObservable wxAdvanceObservable = new PushWXAdvanceObservable() ;
// 具体的观察者 - 微信公众号 - Novate
PushWXUser novate = new PushWXUser("novate") ;
PushWXUser wangziwen = new PushWXUser("wangziwen") ;
// 微信公众号 - 用户订阅公众号
wxAdvanceObservable.register(novate);
wxAdvanceObservable.register(wangziwen);
// 微信公众号 - 推送文章
wxAdvanceObservable.setArticle("《观察者设计模式 - 定义及事例代码》");
// 微信公众号 - 用户取消订阅公众号
wxAdvanceObservable.unregister(wangziwen);
}
}