`

观察者模式以及在Android开发中的应用

阅读更多

my git : https://github.com/hejiawang/

 

一、观察者设计模式定义:

       定义对象之间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

       以上是文言文的,用普通话说就是,有几个对象去观察一个对象的状态,这一个对象状态发生改变时,会通知观察它的那几个对象,这几个对象观察到被观察对象状态发生变化了,然后自己就会做一些事情。这里有两类对象,一个是观察者,一个是被观察者,当然在JDK中,已经为我们准备好了观察者模式的这两类对象,我们先看看用UML体现自己定义的观察者模式如下:



 二、自己定义的观察者模式的代码:

首先要有被观察者:

 

package com.wang.observerPattern;

import java.util.Vector;

/**
 * 被观察者
 * 
 * @author wang
 * 
 */
public abstract class Subject {

	/**
	 * 定义一个观察者数组
	 */
	private Vector<Observer> obsVector = new Vector<Observer>();

	/**
	 * 增加一个观察者
	 * 
	 * @param o
	 *            观察者
	 */
	public void addObserver(Observer o) {
		this.obsVector.add(o);
	}

	/**
	 * 删除一个观察者
	 * 
	 * @param o
	 *            观察者
	 */
	public void delObserver(Observer o) {
		this.obsVector.remove(o);
	}

	/**
	 * 通知所有观察者
	 */
	public void notifyObserver() {
		for (Observer o : this.obsVector) {
			o.update();
		}
	}
}

 具体被观察者:

 

 

package com.wang.observerPattern;

/**
 * 具体被监视者
 * 
 * @author wang
 * 
 */
public class ConcreteSubject extends Subject {

	/**
	 * 被监视者的具体业务
	 */
	public void doSomething() {
		System.out.println(" subject doSomething ... ");
		// 通知观察者
		super.notifyObserver();
	}
}

 观察者:

 

 

package com.wang.observerPattern;

/**
 * 观察者
 * 
 * @author wang
 * 
 */
public interface Observer {

	/**
	 * 更新方法
	 */
	public void update();
}

 具体的观察者:

 

 

package com.wang.observerPattern;

/**
 * 具体观察者
 * 
 * @author wang
 * 
 */
public class ConcreteObject implements Observer {

	@Override
	public void update() {
		System.out.println("ConcreteObject update ... ");
	}

}

 自己定义的观察者模式的应用:

 

 

package com.wang.observerPattern;

public class App {
	
	public static void main(String[] args) {
		ConcreteSubject subject = new ConcreteSubject();
		Observer obs = new ConcreteObject();
		subject.addObserver(obs);
		subject.doSomething();
	}
}

 这样,就自己定义了一个观察者模式。观察者模式有利于观察者和被观察者之间的抽象耦合,能够建立一套触发机制

 

三、上面说过,JDK已经为我么定义了观察者和被观察者的接口,以方便哪些暴漏狂们使用,我们通过继承或者实现,就能很方便的完成观察者模式。JDK中提供的java.util.Observable实现类和java.util.Observer接口。



 

修改过的被观察者:

 

package com.wang.observerPattern.jdk;

import java.util.Observable;

public class Subject extends Observable implements  ISubject{

	//这里的ISubject,是自己定义的背观察者接口,定义这个被观察者都要完成什么业务逻辑
        public void doSomething(){
                system.out.println("xxx");
                super.setChanged();
		super.notifyObservers("yyy");
        }
}

 观察者的代码:

 

 

package com.wang.observerPattern.jdk;

import java.util.Observable;
import java.util.Observer;

public class MyObserverimplements Observer {

	@Override
	public void update(Observable o, Object arg) {
		System.out.println(arg.toString());
	}

}

 App应用类与上面的一样,我们能够看到,有了JDK自带的观察者定义,我们在使用观察者模式,确实方便了很多,在使用时不要忘了在被观察者中,通知观察者的代码:

super.setChanged();
super.notifyObservers("yyy");

 四、观察者模式在Android开发中的应用。

 

       在Android开发中,观察者模式是非常常用的,能够实现触发机制,Android源码也为我们提供了观察者的使用方法,比如说在四大主件中的内容提供者ContentProvider中。首先定义一个Uri,然后在被观察者的方法中使用代码:

 

getContext().getContentResolver().notifyChange(uri, null);

 在观察者中注册,使用代码:

 

 

this.getContentResolver().registerContentObserver(uri, true, new MyObserver());

//MyObserver是一个内部类
private class MyObserver extends ContentObserver {

		public MyObserver() {
			super(new Handler());
		}

		@Override
		public void onChange(boolean selfChange) {
			super.onChange(selfChange);
			System.out.println("观察到修改操作");
		}
	}

 举一个示例。比如说,我想在手机产生呼叫记录时进行一些操作,那么,就可以观察手机呼叫记录数据的变化,就能够用观察者模式实现,

private class InnerTeleStateListener extends PhoneStateListener {

		/**
		 * 当电话呼叫状态发生改变时调用的方法
		 */
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {

			switch (state) {
			case TelephonyManager.CALL_STATE_RINGING: // 响铃状态
				getContentResolver().registerContentObserver(
							CallLog.Calls.CONTENT_URI, true,
							new MyObserver(new Handler(), 
                                                        incomingNumber));
				}
				break;
			
			}
			super.onCallStateChanged(state, incomingNumber);
		}
	}

 上面的代码就是说,当手机来电话后,我们就观察通话记录是否发生变化,只要数据一变化,就执行MyObserver类中的onChange方法

private class MyObserver extends ContentObserver {
		private String incomingNumber;
		public MyObserver(Handler handler, String incomingNumber) {
			super(handler);
			this.incomingNumber = incomingNumber;
		}
		// 当内容发生变化时调用
		@Override
		public void onChange(boolean selfChange) {
			super.onChange(selfChange);
			System.out.println("观察到数据变化");
			// 取消内容观察者
			getContentResolver().unregisterContentObserver(this);
		}
	}

 大功告成。。。观察者模式还是很好理解的,也是很常用的。

附上Android中ContentProvider观察者模式的测试的工程,AndroidProject,更多更全的代码欢迎前去我的git代码库:https://github.com/hejiawang/    这里面也有上面观察者模式的代码。

 

  • 大小: 27.6 KB
  • 大小: 25.1 KB
4
4
分享到:
评论

相关推荐

    Android源码中观察者模式的运用.pdf

    Android源码中观察者模式的运用.pdf

    安卓开发观察者模式应用-一个service通知多个activity更新ui的实现

    安卓开发观察者模式应用-一个service通知多个activity更新ui的实现, service与activity的交互: 1.接口回调 2.自定义广播 3.观察者模式

    Android源码设计模式解析与实战

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察...

    Android 源码设计模式解析与实战

    优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、...观察者模式、备忘录模式、迭代器模式、模板方法模式、访问者模式、中介者模式、代理模式、组合模式、适配器模式、装饰模式、享元模式、外观...

    Android源码设计模式解析与实战PDF

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察...

    《Android 源码设计模式解析与实战》

    优化代码的首步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察...

    何红辉关爱民-Android源码设计模式解析与实战(带书签第2版).pdf

    一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特原则、单例模式、Builder模式、原型模式、工厂方法模式、抽象工厂模式、策略模式、状态模式、责任链模式、解释器模式、命令模式、观察者模式、...

    何红辉关爱民-Android源码设计模式解析与实战(带书签高清第2版).pdf

    优化代码的第一步、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、...观察者模式、备忘录模式、迭代器模式、模板方法模式、访问者模式、中介者模式、代理模式、组合模式、适配器模式、装饰模式、享元模式、外观...

    Android-Design-Patterns:常见的设计模式 Android 中的独特模式

    观察者模式 按钮中的侦听器 MVC模式 列表活动 MVVM 模式 外观图案 安卓媒体框架 桥接模式 适配器视图/适配器 工厂方法 模板模式 装饰模式 单例模式 输入法管理器 Android 中的独特模式: 名称 类型 用 关联 高级...

    《Android应用开发》个人总结报告.doc

    《Android应用开发》个人总结报告 刚开始接触Android感觉到它很有意思,在界面开发上和web也可以形成了相通的架构 ,更加方便,视觉上也是非常的酷,在前期我通过的大量的Android SDK开发范例大全中的例子以及...

    Android源码学习之观察者模式应用及优点介绍

    观察者模式定义: Define a one-to-many dependency between objects so that when one object changes state, all its dependents aer notified and updated automatically. 定义对象间一种一对多的依赖关系,使得...

    Android UI组件实例集合

    GifAction.java 观察者类,监视GIF是否加载成功 GifFrame.java 里面三个成员:当前图片、延时、下张Frame的链接。 GifDecoder.java 解码线程类 GifView.java 主类,包括常用方法,如GifView构造方法、设置图片源、...

    DesignPattern:23种设计模式,Android原始设计模式分析-android

    工厂方法模式,抽象工厂模式,建造者模式,原型模式结构型模式7种适配器模式,装饰器模式,代理模式,外观模式,替代模式,组合模式,享元模式行为型模式11种策略模式,模板方法模式,观察者模式,继承子模式,责任...

    android 网络应用轻量框架-多线程管理-高效缓存-设计模式

    6:使用状态模式 观察者模式更好的处理多线程 最初的想法:网络优化开发框架 (移除任务未完成) 网络稳定,系统运行稳定性,大内存消耗稳定,长时间运行稳定性 (旧的系统症结所在) 开启过多线程,导致系统...

    基于ARM与Android的互联网智能家居系统的设计与实现,优秀毕业设计!

    2、MVC框架(抽象工厂 + 观察者模式) + SSH / Django 3、网络通信(WebSocket + WebRTC + Webservice) 4、服务器推送技术(JPUSH) 5、ARM涉及模块:WIFI模块、网络通信模块、(传感器模块) 6、代码控制管理:...

    Android四大组件之BroadcastReceiver详解

    BroadcastReceiver(广播接收器),在Android开发中,BroadcastReceiver的应用场景非常多,属于Android四大组件之一。 Android 广播分为两个角色:广播发送者、广播接收者 一、 作用 用于监听 / 接收 应用发出的广播...

    Android短信验证码自动填写实现代码

    这个小功能运用到了观察者模式,什么是观察者模式? 观察者模式 :定义对象间的一种一个(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。在本例中,...

    毕业设计项目-智能家居原型开发

    2、MVC框架(抽象工厂 + 观察者模式) + SSH / Django 3、网络通信(WebSocket + WebRTC + Webservice) 4、服务器推送技术(JPUSH) 5、ARM涉及模块:WIFI模块、网络通信模块、(传感器模块) 6、代码控制管理:...

Global site tag (gtag.js) - Google Analytics