




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
观察者模式-Java设计模式观察者模式定义:定义了对象之间的一对多的依赖,这样一来,当一个对象发生改变状态的时候,它的所有依赖者都会收到通知并自动更新。参考如下图:观察者设计模式也叫发布-订阅模式。也可以称作:出版者+订阅者 = 观察者模式在Android中观察者模式的实例有:广播机制,ContentObserver的注册方式,一个是同步的观察者模式,一个是异步的观察者模式。当两个对象之间松耦合,它们依然可以交互,但是不清楚彼此的细节,观察者提供了一种对象的设计,可以降低之间的耦合,避免对象的双向依赖。举例:在Android中很多的Listener是观察者模式,比如点击事件的OnClickListener,就是为了避免对象的双向依赖。-先来看看Java源码中的观察者模式:Observer观察者接口:package com.daming.java.observer;public interface Observer void update(Observable observable, Object arg); 1 2 3 4 5 6对象Observable 类的实现package com.daming.java.observer;import java.util.Vector;public class Observable private boolean changed = false; private Vector obs; public Observable() obs = new Vector(); public synchronized void addObserver(Observer o) if (o = null) throw new NullPointerException(); if (!obs.contains(o) obs.addElement(o); public synchronized void deleteObserver(Observer o) obs.removeElement(o); public void notifyObservers() notifyObservers(null); public void notifyObservers(Object arg) Object arrLocal; synchronized (this) if (!changed) return; arrLocal = obs.toArray(); clearChanged(); for (int i = arrLocal.length - 1; i = 0; i-) (Observer) arrLocali).update(this, arg); public synchronized void deleteObservers() obs.removeAllElements(); protected synchronized void setChanged() changed = true; protected synchronized void clearChanged() changed = false; public synchronized boolean hasChanged() return changed; /* * Returns the number of observers of this Observable object. * * return the number of observers of this object. */ public synchronized int countObservers() return obs.size(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70MyObserver 观察者对象的实现package com.daming.java.observer;public class MyObserver implements Observer Override public void update(Observable observable, Object arg) System.out.println(observable : + observable + arg : + arg); 1 2 3 4 5 6 7 8 9MyObserver2 观察者对象的实现package com.daming.java.observer;public class MyObserver2 implements Observer Override public void update(Observable observable, Object arg) System.out.println(observable2 : + observable + arg2 : + arg); 1 2 3 4 5 6 7 8 9TestObserver类的实现package com.daming.java.observer;public class TestObserver /* * param args */ public static void main(String args) Observable observable = new Observable(); MyObserver myObserver = new MyObserver(); MyObserver2 myObserver2 = new MyObserver2(); observable.addObserver(myObserver); observable.addObserver(myObserver2); observable.setChanged(); observable.notifyObservers(14); observable.setChanged(); observable.notifyObservers(I am daming); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21Log输入结果:observable2 :com.daming.java.observer.Observable14318bbarg2 :14observable :com.daming.java.observer.Observable14318bbarg :14observable2 :com.daming.java.observer.Observable14318bbarg2 :I am damingobservable :com.daming.java.observer.Observable14318bbarg :I am daming 1 2 3 4Java源码中上述代码中用的是推模式,当然源码中也有拉模式,即主动查询的模式。拉模式就像广播一样,通过onReceive()方法拉起来一些动作的,还有像ContentObserver可以通过拉模式,当数据库发生改变的时候,通过onChange()方法来调用一些操作。-接着我们来看看Android中异步的观察者模式。ContentObserver就是异步的观察者模式,异步的观察者有什么好处呢?不阻塞观察者的回调。在同步通知中会有阻塞问题,各个Observer的响应方法是串行的,如果有一个observer耗时的话就会阻塞其他observer接收者了,这样就有可能就会引起bug来,所以在设计的时候多考虑一些,是否考虑用异步的观察者模式,让并发处理快一些;我们通过一个简单的demo来学习下异步的观察者模式:先来看看Observer,这个Android中是抽象的类package cn.daming.observer.design;import android.os.Handler;import android.util.Log;public abstract class Observer private Handler mHandler; public Observer(Handler handler) mHandler = handler; public void onChange() public final void dispatchChange() Log.v(daming, Observer dispatchChange is mHandler= null : + (mHandler = null); if (mHandler = null) onChange(); else mHandler.post(new NotificationRunnable(); private final class NotificationRunnable implements Runnable Override public void run() Log.v(daming, NotificationRunnable dispatchChange is run . ); Observer.this.onChange(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35接着来看看ObserverService这个类的实现:package cn.daming.observer.design;import java.util.ArrayList;import java.util.List;import android.util.Log;public class ObserverService private int mState; private List mObservers = new ArrayList(); public final void registerObserver(Observer observer) if (!mObservers.contains(observer) mObservers.add(observer); public final void unregisterObserver(Observer observer) Log.v(daming, ObserverService unregisterObserver :); mObservers.remove(observer); public void notifyChange() for (Observer observer : mObservers) observer.dispatchChange(); public int getState() return mState; public void setState(int state) mState = state; notifyChange(); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40最后我们来写测试类FirstActivity :package cn.daming.observer.design;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import com.daming.designtraning.R;public class FirstActivity extends Activity private ObserverService mObserverService; private Button mButton; private int mState = 0; Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.button); mObserverService = new ObserverService(); mObserverService.registerObserver(mFirstObserver); mObserverService.setState(+mState); mButton.setOnClickListener(new OnClickListener() Override public void onClick(View v) mObserverService.setState(+mState); ); Override protected void onDestroy() super.onDestr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025内蒙古通辽新正电工技术服务有限公司招聘41人考前自测高频考点模拟试题(含答案详解)
- 2025标准机械设备采购合同范本
- 2025年天台县民政局下属事业单位公开选聘工作人员1人模拟试卷及完整答案详解1套
- 2025海南软件职业技术学院考核招聘事业编制专任教师15人模拟试卷及答案详解(网校专用)
- 2025包头常铝北方铝业有限责任公司招聘35人模拟试卷有答案详解
- 2025年陕西大秦电能集团有限公司安康大禹公司招聘(1人)模拟试卷有完整答案详解
- 2025河南信阳市潢川县退役军人事务局招聘3名全日制公益性岗位考前自测高频考点模拟试题参考答案详解
- 2025北京市海淀区锦秋学校招聘考前自测高频考点模拟试题及参考答案详解一套
- 2025年安徽省立医院医技及医辅人员招聘131人考前自测高频考点模拟试题及1套完整答案详解
- 2025广西柳州市防洪办公室招聘编外人员1人模拟试卷及答案详解(考点梳理)
- 2025年共青团考试题库(附答案)
- 全国数智产业发展研究报告(2024-2025)
- 2025麻精等特殊管理药品考核(医、药、护人员)试题及答案
- 新版中华民族共同体概论课件第六讲“五胡入华”与中华民族大交融(魏晋南北朝时期)-2025年版
- 六堡茶课件教学课件
- 材料作文“交流登山成功的经验”(2024年河南省中考满分作文9篇附审题指导)
- 2025年中国宽温液晶屏行业市场全景分析及前景机遇研判报告
- 小学语文高段课程标准解读
- 智慧水务项目可行性研究报告
- 教育创新战略华润如何打造未来领袖孵化器
- 2025年四川省高考化学试卷真题(含答案解析)
评论
0/150
提交评论