观察者模式详解Demo
程序员文章站
2024-03-25 20:22:40
...
观察者模式细分的话可以分为以下几个具体对象:
观察者,具体观察者,被观察者,具体被观察者,以下通过一个小的应用场景具体详解:
假如:微信公众号是被观察者,那么微信公众号中的《Android前沿技术》这个订阅号就是一个具体的被观察者,微信用户就是观察者,个人就是具体观察者。
首先定义微信公众号类:
import com.example.myproject.observer.IWXUser;
import java.util.ArrayList;
import java.util.List;
/**
* Created by hcDarren on 2017/10/14. 微信公众号
* 微信公众号: 多个人去订阅我们的公众
*
* WXPublicObservable 和 IWXUser 关系? 1对多
* WXPublicObservable 代表的不是具体的公众号,代表的是公众号
*/
public class WXPublicObservable {
// 所有订阅的用户(公众号用户)
public List<IWXUser> mWXUsers;
public WXPublicObservable(){
mWXUsers = new ArrayList<>();
}
/**
* 订阅
*/
public void register(IWXUser wxUser){
mWXUsers.add(wxUser);
}
/**
* 取消订阅
* @param wxUser
*/
public void unregister(IWXUser wxUser){
mWXUsers.remove(wxUser);
}
/**
* 更新文章
* @param article
*/
public void update(String article){
// 推送文章更新
for (IWXUser wxUser : mWXUsers) {
wxUser.push(article);
}
}
}
其次定义一个具体的被观察者:
/**
* Created by hcDarren on 2017/10/14.
* 微信公众号 - Android进阶之旅公众号
*/
public class WXAdvanceObservable extends WXPublicObservable {
private String article;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
// 通知更新,推送给微信用户
update(article);
}
}
定义一个观察者——微信用户:
/**
* Created by hcDarren on 2017/10/14.
* 微信公众号 - 微信用户
*/
public interface IWXUser {
public void push(String article);
}
定义一个具体的观察者:
/**
* Created by hcDarren on 2017/10/14.
* 微信公众号 - 具体订阅用户(Darren,高岩)
*/
public class WXUser implements IWXUser {
private String name;
public WXUser(String name) {
this.name = name;
}
@Override
public void push(String article) {
System.out.println(name + " 收到了一篇文章:" + article);
}
}
接下来定义一个测试类,测试具体的流程是不是能跑通:
import com.example.myproject.observable.WXAdvanceObservable;
import com.example.myproject.observer.WXUser;
/**
* Created by hcDarren on 2017/10/14.
*/
public class Client {
public static void main(String[] args){
// 微信公众号 - 具体的被观察者 - Android进阶之旅
WXAdvanceObservable wxAdvanceObservable = new WXAdvanceObservable();
// 微信公众号 - 具体的观察者 - Darren,高岩
WXUser darren = new WXUser("darren");
WXUser gaoyan = new WXUser("高岩");
// 微信公众号 - 用户订阅公众号
wxAdvanceObservable.register(darren);
wxAdvanceObservable.register(gaoyan);
// 微信公众号 - 推送文章
wxAdvanceObservable.setArticle("《代理设计模式 - 实现 Retrofit 的 create》");
// 微信公众号 - 用户取消订阅公众号
wxAdvanceObservable.unregister(darren);
// 微信公众号 - 推送文章
wxAdvanceObservable.setArticle("第三方框架 - EventBus 源码分析和手写");
}
// RXJava + OKHttp + Retrofit
}
以上便是一个简单的观察者模式Demo.