安卓关于设计模式_观察者模式
来源:互联网 发布:php多人游戏源码 编辑:程序博客网 时间:2024/05/17 01:06
观察者模式:
定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会自动收到通知并更新
设计原则:
为了交互对象之间的松耦合设计而努力(降低了对象之间的互相依赖)
1. 当两个对象之间松耦合,它们依然可以交互,但是不清楚彼此间的细节;
2. 一对多的关系是如何关联的: 一方面 "一个" 主题拥有状态,并且能够控制这些状态;另一方面,有 "多个" 观察者都能够接收并使用这些状态,虽然它们并不具有这些状态;
3. 期间的依赖是如何产生的: 主题是状态的拥有者,观察者依赖状态的改变而刷新数据,但是以什么样的方式刷新数据与状态无关;
观察者模式简单的UML:
具体实现:
1. 创建一个主题类来控制监听:
public class Constants { private List<GetFiles> list; //存放要监听的对象的集合 private Object obj; //要传的参数,这里先定义成obj类型 public Constants(){ if(list == null){ list = new ArrayList<>(); } } public void addRegister(GetFiles observer){ //添加到监听 list.add(observer); } public void removeRegister(GetFiles observer){ //移除监听 int i = list.indexOf(observer); if(i >= 0){ list.remove(i); } } public void onChange(){ //假设改变的时候就触发这个方法 for (int i = 0; i < list.size(); i++) { GetFiles getFiles = list.get(i); getFiles.updata(obj); } }
2. 定义观察者的接口:
public interface GetFiles { void updata(Object obj);
3. 观察者具体实现:
public class GetVideoFiles implements GetFiles { private Constants constants;//主题对象 public GetVideoFiles(Constants constants){ this.constants = constants;//拿到主题对象,移除监听的时候可以用到 constants.addRegister(this);//添加注册监听 } @Override public void updata(Object obj) { //更新数据 } public void register(){ constants.removeRegister(this); }
4. 当然为了方便,可以将 GetFiles 接口当做 Constants 主题的一个内部接口,然后再在其里面提供一个 setGetFiles() 的方法,将对象传过去,然后就可以直接调用方法 getFiles.updata(obj)了,我一般的接口回调都是这么写的。
补充:
观察者模式作为JDK中使用最多的模式之一,平时也会经常遇到,比如:activity 与 fragment 的交互,activity 与 broadcast 的交互,按钮监听,文件监听fileobserver等等。当然观察者模式除了我上面说得 pull 的方式之外,还有一种就是通过 get 的方式,只通知改变,不传递数据,观察者要什么数据就去主题那里取什么数据。
0 0
- 安卓关于设计模式_观察者模式
- 安卓设计模式之_观察者模式
- 安卓设计模式之观察者模式
- 安卓设计模式之观察者模式
- 安卓设计模式の观察者模式
- 安卓关于设计模式_策略模式
- 安卓关于设计模式_装饰者模式
- 安卓关于设计模式_工厂模式
- 设计模式_观察者模式
- 设计模式_观察者模式
- 设计模式_观察者模式
- 设计模式_观察者模式
- 设计模式_观察者模式
- 设计模式_观察者模式
- 设计模式_观察者模式
- 设计模式_观察者模式
- 安卓设计模式_命令模式
- 设计模式_观察者模式_待
- linux等待队列使用步骤
- 关于edittext焦点消失的一个bug记录
- 仿QQ侧滑删除,自定义ListView
- IntelliJ IDEA 设置 JVM 运行参数
- angularjs 手动加载以及误区
- 安卓关于设计模式_观察者模式
- 【Java每日一题】20161104
- maven moduels 的pom文件
- easyui-datagrid行编辑,后台以主表为基表关联从表进行查询数据后,在前台行编辑字段内容的显示
- HDOJ 1081 POJ 1050 ZOJ 1074 TO THE MAX【dp】
- Unity3d碰撞检测中碰撞器与触发器的区别
- java 循环结构
- Github开源Android组件资源整理(一) 个性化控件(View)
- 编程题