观察者模式在android中使用

观察者模式(Observer)

观察者模式是对象的行为模式,又被叫做为模型-视图模式。这种模式定义了一种一对多的依赖关系,使多个观察者对象同时监听某个角色对象。一旦这个角色对象的状态发生了变化,就会通知所有观察者对象,使它们能够自动更新自己本身。

下面来看下观察者模式的结构,具体如下:

从上面图中可以看出,观察者模式涉及了四个角色,具体如下所示:

A、抽象实体角色:这个角色为抽象角色,它把所有的对观察者对象的引用都保存在一个聚集中,每个主题对象都可以有若干个观察者对象,主题角色又叫做抽象被观察者对象,一般用抽象类或接口表示。

同时,这个角色中含有了对观察者具体的管理方法及当主题角色发生改变时通知所有观察者对象。

B、具体实体角色:这个角色为具体实现了抽象的实体角色的具体角色。它含有了一个对实体角色状态的引用,一但实体角色改变,那么就会调用通知方法通知所有观察者对象。

C、抽象观察者对象:这个角色为所有的具体的观察者对象提供通用的接口,在得到实体变化的通知时实时的更新自己,这个角色一般用抽象类和接口来实现。

D、具体观察者对象:将有关的状态放到具体观察者对象中,在具体主题的内部的状态改变时,给所有的观察者发送通知。该角色又叫做为具体被观察者角色。

下面具体举例来说明观察者模式的使用。例子是这样的:用户现在要购买若干件同一品牌的不同款式的衣服,假如用户已经选好了不同款式的衣服,现需要实现添加到购物车并支付;支付成功之后,现在需要及时刷新用户的购物车,以便用户可以及时知道自己支付的结果,方便从新支付或挑选其他款式并支付。好了,具体需要描述完了,接下来请看功能详细类图说明:

下面直接看代码吧!我会在下面列出观察者模式的核心代码,其他请参看我上传的项目代码包,具体如下:

抽象实体角色(Cart):

/**

* @description :

* 抽象实体角色-观察者关注的对象实体

*/

public
abstract class
Cart {

private Vector<SalesObserver>
observers = new Vector<SalesObserver>();

public Cart() {

super();

}

/**

* @description :

* 登记一个观察者对象

*/

public
void
attach(SalesObserver observer) {

observers.addElement(observer);

}

/**

* @description :

* 删除一个已经登记的观察者对象

*/

public
void
detach(SalesObserver observer) {

observers.removeElement(observer);

}

public
void
detach(int
index) {

observers.remove(index);

}

/**

* @description :

* 通知所有已经登记过的观察者对象

*/

public
void
notifyAllBills(){

Enumeration<?>enumes = observers();

while(enumes.hasMoreElements()){

SalesObserverobj = (SalesObserver)enumes.nextElement();

obj.updateSale(obj);

}

}

/**

* @description :

* 支付成功之后,更新购物车内的所有商品的支付状态

* 注意:这里更新的是本地缓存数据(不通过接口更新)

*/

public
boolean
billsPay() {

boolean
payStatus = true;

// 异步网络支付

// TODO

// 这里模拟支付成功

if(payStatus) {

// 更新本地缓存数据

updateLocalCache();

}

return
true
;

}

/**

* @description :

* 更新缓存

*/

private
void
updateLocalCache() {

for(SalesObserver
obs : observers) {

Salesale =
obs.getSale();

sale.setPayStatus("支付完成");

}

}

public Enumeration<?> observers() {

return
observers.elements();

}

}

具体实体角色(ShoppingCart):

/**

* @description :

* 具体的实体角色-具体通知各个观察者对象更新状态

*/

public
class
ShoppingCart extends Cart {

public ShoppingCart() {

super();

}

protected
void
billPayResult(boolean
flag) {

if(!flag) {

// 支付失败提示(这里不考虑这种情况)

return;

}

// notify obervers

notifyAllBills();

}

}

抽象观察者角色(Observer):

/**

* @description :

* 抽象观察者-为所有具体观察者提供更新方法

*/

public
interface
Observer{

public Object updateSale(Object
obj);

}

具体观察者角色(SalesObserver):

/**

* @description :

* 具体观察者-具体执行更改状态的操作

*/

public
class
SalesObserver implements Observer {

private Sale
sale = null;

public SalesObserver(Sale
sale) {

this.sale =
sale;

}

@Override

public Object updateSale(Object
obj) {

this.sale = (Sale)
obj;

return
sale;

}

public Sale getSale() {

return
sale;

}

public
void
setSale(Sale sale) {

this.sale =
sale;

}

}

好了,核心的代码已经贴上了,下面会列出整个流程的演示效果图:

添加购物车:

移除购物车:

支付之后效果(之前购物车和移除购物车效果相同略):

好了,到这里观察者模式已经介绍完了,希望对你有帮助,另外,原创作品来之不易,转载请注明谢谢。

点击我下载代码!

技术交流群:179914858

时间: 2024-10-08 04:42:47

观察者模式在android中使用的相关文章

Android 中的观察者模式Observer

转载请注明出处:http://blog.csdn.net/feiduclear_up/article/details/42167487 观察者模式"定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都将得到通知,并自动更新",可以理解成多个观察者向一个被观察者订阅消息,当被观察者发生改变时通知相应的观察者去作自己的事情.Android 中的观察者 实现Observer接口,被观察者继承Observable类.使用步骤如下: 1.观察者DataWatch

Android中观察者模式的升入理解

以前对Java中的观察者模式只知道一点皮毛,在接触Android的过程中,逐渐认识到观察者模式是如此的重要,android中许多地方都用到了观察者模式例如ContentResolver操作,来总结一下android中观察者模式的使用技巧 我所理解的观察者模式是这样子的:: 以一个例子来说明: 在service中有一个int类型的数据i,我在service中启动一个定时器去不断更新这个值,当我在activity中启动这个服务一次之后,每当i变化的时候我的activity要自动的同步更新这个值来显示

Android中的设计模式-观察者模式

观察者模式 观察者模式,有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式.一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知. 观察者模式算是一个比较常用的模式了,使用上就像是订阅RSS,当有新的新闻更新,接受订阅的主题就会向每一个订阅者发送消息,这里的发送消息一般是调用订阅者的已经定义好的函数,如OnEvent()等.也可以通过其他方式发送消息给订阅者,比如Handler.不拘泥于固定的方

Android中的观察者模式:消息分发器(MessageDispatcher)

这个功能是在公司项目需求的时候写出来,本来是基础命令字模式的,但是个人喜欢对象,所有后来在一个小项目中使用时,改成了基于对象模式. 首先,是一个接口,我们称之为监听器: [html] view plaincopyprint? /** * * @author poet * */ public interface MessageObserver<T> { void onMessage(T t); } 这里使用的是泛型,泛型<T>除了作为实际监听的对象类型,也作为监听器管理的key,届时

观察者模式在android 上的最佳实践

在上一篇文章中介绍了介绍了观察者模式的定义和一些基本概念,观察者模式在 android开发中应用还是非常广泛的,例如android按钮事件的监听.广播等等,在任何类似于新闻-订阅的模式下面都可以使用.从某种意义上面来说android有点像JAVA EE的WEB页面,在都需要提供View层用于进行操作,在多个页面之间传递数据发送通知都是一件很麻烦的事情. 在android中从A页面跳转到B页面,然后B页面进行某些操作后需要通知A页面去刷新数据,我们可以通过startActivityForResul

[Android]GOF23种设计模式 &amp; Android中的设计模式

GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对于扩展是开放的, 对于修改是封闭的. 3. 依赖倒转原则: A. 高层模块不应该依赖低层模块,两个都应该依赖抽象.B.抽象不应该依赖细节,细节应该依赖抽象.说白了,就是要针对接口编程,不要对实现编程. 4. 迪米特法则(LoD):如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用.如

那些Android中的性能优化

性能优化是一个大的范畴,如果有人问你在Android中如何做性能优化的,也许都不知道从哪开始说起. 首先要明白的是,为什么我们的App需要优化,最显而易见的时刻:用户say,什么狗屎,刷这么久都没反应,取关卸载算了. 这跟什么有关,我们先苍白的反驳下,尼玛用户设备老旧网又烂,关我屁事,根本不用优化.可是,老板拍板了,施压给CTO,然后CTO又来找你:Y的今天必须给我想办法优化了,不然不准回家. 好吧,为什么从UI的表象上看,App又卡又慢而且还错乱.我们试着来剖析下吧. 题外话:把minSDK改

Android中你应该知道的设计模式

建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常用的就是Dialog的构建,Notification的构建也是标准的建造者模式. 建造者模式很好理解,如果一个类的构造需要很多参数,而且这些参数并不都是必须的,那么这种情况下就比较适合Builder. 比如构建一个AlertDialog,标题.内容.取消按钮.确定按钮.中立按钮,你可能只需要单独设置几个属性即可:另外在我的OkHttpPlus项目中,构造一个Http请求也是这样的,有可能你只需要设置URL,有可能需要添加

《Android源码设计模式解析》读书笔记——Android中你应该知道的设计模式

断断续续的,<Android源码设计模式解析>也看了一遍,书中提到了很多的设计模式,但是有部分在开发中见到的几率很小,所以掌握不了也没有太大影响. 我觉得这本书的最大价值有两点,一个是从设计模式的角度去理解Android源码,结合着日常开发中的常用类,对设计模式的理解会更加的深刻:另外一个好处就是了解常用模式,再看其他人写的代码的时候,更容易理解代码思路.下面是我的读书笔记和一些思考,设计模式只整理我认为重要的部分. 建造者模式 建造者模式最明显的标志就是Build类,而在Android中最常