`

观察者模式以及在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中TextView文本内容发生变化为背景

    此外,观察者模式在Android中还有其他的应用场景,比如BroadcastReceiver,它可以监听系统或应用的广播事件,以及LiveData在MVVM架构中的应用,它能让View层实时响应Model层的数据变化。 通过这个以TextView为例的...

    一个类实现Android观察者模式(最简单实用的观察者模式)

    观察者模式是软件设计模式中的一种行为模式,它在Android开发中被广泛应用,尤其是在处理事件响应和组件间的通信。这个模式允许对象订阅另一个对象的状态变化,当被观察的对象发生改变时,所有订阅者都会被通知并...

    观察者模式示例代码 android studio kotlin代码 基于java.uitl.*

    这个例子展示了如何在Android项目中使用Kotlin和`java.util.*`包中的观察者模式,虽然在现代Android开发中,我们更倾向于使用Kotlin的协程和LiveData等工具来实现异步通信和事件处理,但理解基本的观察者模式对于...

    Android 设计模式学习之观察者模式应用实例

    总结来说,观察者模式在Android开发中扮演着重要角色,它简化了对象之间的交互,使得系统更加模块化,同时也提高了代码的可扩展性和可维护性。通过理解和熟练运用观察者模式,开发者能更好地设计出高效、健壮的...

    Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况

    总之,观察者模式在Android开发中扮演着重要角色,它能帮助我们构建松耦合、可扩展的系统,提高代码的复用性和可维护性。正确地理解和应用观察者模式,对于成为一名优秀的Android开发者至关重要。

    android学习日记-6 观察者模式与订阅者模式

    在Android开发中,观察者模式(Observer Pattern)和订阅者模式(Subscriber Pattern)是两种重要的设计模式,它们在实现事件驱动编程中起着关键作用。本文将深入探讨这两种模式的概念、工作原理以及在Android开发中...

    android Observer(观察者模式)_案例祥解.pdf

    观察者模式详解 观察者模式是23种设计模式中的一种,尤其是在软件设计过程中体现的更是立足...观察者模式是一种常用的设计模式,广泛应用于软件开发中。本文详细讲解了观察者模式的概念和实现,希望对读者有所帮助。

    观察者模式for android demo

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它在Android开发中扮演着重要的角色,主要用于实现对象之间的解耦。在这个“观察者模式for android demo”中,我们将深入探讨如何在Android环境中应用该...

    Android 设计模式:(一)观察者模式 —— 封装行为的大局观

    例如,在`StrategyDemo`这个示例中,我们可以假设它演示了如何在Android应用中使用观察者模式来处理用户交互或数据变化。`StrategyDemo`可能包含以下几个关键部分: 1. **Subject(主题)**:这是被观察的对象,...

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

    观察者模式是设计模式中的一种,它在软件开发中扮演着重要的角色,特别是在大型系统和分布式应用程序中。本文主要探讨了观察者模式在Android源码中的应用,揭示了这一模式如何帮助实现组件间的松耦合和高效通信。 ...

    Android观察者模式设计思想

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它在Android开发中被广泛应用于事件处理和状态同步。这种模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象...

    [android]观察者模式demo

    在Android开发中,观察者模式(Observer Pattern)是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程,...

    android 观察者模式

    在Android开发中,观察者模式(Observer Pattern)是一种行为设计模式,它允许对象在其状态发生变化时通知其他对象。这种模式广泛应用于数据绑定、事件处理和实时系统,使得系统中的组件可以松散耦合,提高代码的...

    android观察者模式Demo

    在Android开发中,观察者模式(Observer Pattern)是一种常见的设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个"android观察者模式...

    观察者模式在MVP中的应用

    在MVP(Model-View-Presenter)架构中,观察者模式被广泛应用,以实现高效的数据同步和事件处理。MVP是软件开发中的一种常见设计模式,尤其在Android应用开发中非常流行。 MVP全称为Model-View-Presenter,主要分为...

    Android监听——回调模式与观察者模式

    在Android开发中,回调模式和观察者模式是两种常见的事件处理机制,它们在软件设计模式中扮演着重要的角色,主要用于实现组件之间的通信。本文将详细探讨这两种模式,并结合Android环境进行解析。 首先,我们来理解...

    Android观察者模式

    在Android开发中,观察者模式(Observer Pattern)是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程,...

Global site tag (gtag.js) - Google Analytics