




已阅读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山东菏泽康和精神专科医院招聘9人考试模拟试题及答案解析
- 小金县2025年医疗卫生辅助岗招募(5人)考试参考题库附答案解析
- 2025广西贵港市平南县事业单位公开选调56人考试模拟试题及答案解析
- 2025广东江门开平市选调公务员14人考试备考试题及答案解析
- 2025陕西咸阳渭城区就业见习人员招聘70人考试参考题库附答案解析
- 2025青海西宁市城中区教育局面向社会招聘临聘幼儿教师6人考试模拟试题及答案解析
- 2025广西玉林市福绵区计量和产品质量监控中心招聘见习生5人笔试参考题库附答案解析
- 2025年甘肃甘南州事业单位招聘工作人员311人考试备考题库及答案解析
- 安远县2025年城区及周边乡镇学校公开选调教师【81人】考试备考题库及答案解析
- 2025浙江宁波市慈溪市白沙路街道公办幼儿园招聘派遣制工作人员3人考试备考题库及答案解析
- 2024年三亚市海棠区营商环境建设局一级科员招录1人《行政职业能力测验》高频考点、难点(含详细答案)
- 2024-2030年中国培南类抗菌药物行业市场运行态势及发展战略研究报告
- 知识题库-人社练兵比武竞赛测试题及答案(七)
- 陆上石油天然气开采安全管理人员复习题
- 孔子的美学思想对现代设计的启示
- 回弹法测试原始记录表
- 《热力发电厂》热力发电厂全面性热力系统
- 新教师岗前培训讲座中小学教学常规PPT
- 2023年国家电网公司电力安全工作规程(变电部分)2023年6月修订
- 大概念教学的实践与探索
- DB15-T 3015-2023地理标志产品 俄体粉条
评论
0/150
提交评论