观察者模式抽取的工具类
来源:互联网 发布:linux编译工具链 编辑:程序博客网 时间:2024/04/19 09:35
最近项目有很多需要在Activity中传送数据、数据更改后刷新界面、异步更新数据的地方,所以对观察者模式做了一个抽取,做了一个工具包,使用的时候非常简单,下面上代码~
例如,以某个类作为数据进行公布:
public class Task implements Publisher.Publishable{}
需要注意作为数据的类要实现这个Publishable接口,然后创建TaskPublisher
public class TaskPublisher { public static final Publisher publisher = new Publisher(); public static final PublishableHolder<Task> task = new PublishableHolder<>(publisher);}
这里publisher变量是用来注册和注销的入口,它本身实现了观察者模式的通知方法,Publishable接口也在Publisher类中
public class Publisher { private final List<Observer> observers; public Publisher() { this.observers = new ArrayList<>(); } /** * 注册 * * @param observer */ public void register(Observer observer) { if (!isRegistered(observer)) { observers.add(observer); } } /** * 注销 * * @param observer */ public void unRegister(Observer observer) { if (isRegistered(observer)) { observers.remove(observer); } } public boolean isRegistered(Observer observer) { return observers.contains(observer); } /** * 获取注册听众数量 * * @return */ public int getObserversCount() { return observers.size(); } /** * 通知所有听众 */ public void notifyObservers(Object data) { if (observers.size() > 0) { for (Observer observer : observers) { if (observer != null) { observer.update(data); } } } } public interface Observer { void update(Object data); } public interface Publishable { }}
当你在某个类中实现了Publisher.Observer接口的update方法后,就可以调用注册方法进行注册了
public class TaskObserver implements Publisher.Observer{ public void update(Object data){ // do something }}
TaskObserver taskObserver = new TaskObserver();//注册TaskPublisher.publisher.register(taskObserver);//注销TaskPublisher.publisher.unRegister(taskObserver);
进行注册之后,获取需要的数据
Task task = TaskPublisher.task.getData();
需要注意,一定要在注册之后获取数据,否则异步操作有可能让你错过一次数据更新!
那么剩下的就是PublishableHolder了,见代码
public class PublishableHolder<P extends Publisher.Publishable> { private final Publisher publisher; private P data; public PublishableHolder(Publisher publisher) { this.publisher = publisher; } public P getData() { return data; } public void setData(P data) { this.data = data; publisher.notifyObservers(this.data); } /** * 在data的引用地址不改变的情况下修改data内部的数据推荐调用此方法 * 否则需要自行通知publisher * * @param changer */ public void modifyData(DataChanger changer) { if (changer != null) { changer.doChange(data); publisher.notifyObservers(data); } } /** * 修改数据接口 */ public interface DataChanger<P extends Publisher.Publishable> { void doChange(P data); }}
另外还可以使用List<Publishable>的数据,用到了另一个类PublishableListHolder
public class PublishableListHolder<P extends Publisher.Publishable> { private final List<P> list; private final Publisher publisher; public PublishableListHolder(Publisher publisher) { list = new ArrayList<>(); this.publisher = publisher; } public void setList(List<P> list) { this.list.clear(); this.list.addAll(list); publisher.notifyObservers(this.list); } public List<P> getList(Publisher.Observer observer) { return list; } public void addItem(P publishable) { list.add(publishable); publisher.notifyObservers(list); } public void removeItem(P publishable) { if (list.contains(publishable)) { list.remove(publishable); publisher.notifyObservers(list); } } public void addAll(List<P> publishableList) { list.addAll(publishableList); publisher.notifyObservers(list); } public void removeAll(List<P> publishableList) { list.removeAll(publishableList); publisher.notifyObservers(list); } public void clear() { list.clear(); publisher.notifyObservers(list); }}
0 0
- 观察者模式抽取的工具类
- jdbc工具类的抽取。
- jdbc 工具类的抽取
- Cocos2dx 提供的观察者模式工具类 CCNotificationCenter
- javaweb_day7(JDBC)jdbc的工具类抽取
- Gson工具的抽取
- JdbcUtils工具的抽取
- MVP模式下面基类的抽取
- dtp的抽取模式
- RSS抽取相关工具类
- Java简化正则表达式的使用(抽取工具类)
- 百度地图SDK工具类(观察者模式)
- 观察者工具类NotificationUtil
- 下载管理器类的封装(观察者模式)
- 观察者模式的应用
- 观察者模式的应用
- 增强的观察者模式
- 观察者模式的理解
- Android进程保活方法
- 二维数组和三维数组
- 每个程序员都需要学习 JavaScript 的7个理由
- 几款常见的数学教学软件
- 键盘事件event.keyCode ,event.which ,event.charCode
- 观察者模式抽取的工具类
- 【小镇的技术天梯】lanmp服务器集群搭建(6)rsync+inotify同步主备nfs
- php 发送get,post 请求
- [欧拉函数] BZOJ 2226 [Spoj 5971] LCMSum
- WampServer修改Mysql密码的步骤
- android 控件 fragment 切换优化 混乱
- Spring配置文件中component-scan 扫描指定的包中的类上常用的注解
- ScrollView只能有一个子控件
- 使用框架结构之frameset