文档章节

Android 观察者模式

SRain215
 SRain215
发布于 2016/04/22 17:13
字数 756
阅读 61
收藏 2

观察者模式

       定义对象间的一种一个(Subject)对多(Observer)的依赖关系,当一个对象的状态发送改变时,所以依赖于它的对象都得到通知并被自动更新。   

  当然,MVC只是Observer模式的一个实例。Observer模式要解决的问题为: 

  建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候, 依赖这个“一”的多也能够同步改变。最常见的一个例子就是:对同一组数据进行统计分析时候,  我们希望能够提供多种形式的表示(例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。 这些表示都依赖于同一组数据,我们当然需要当数据改变的时候,所有的统计的显示都能够同时改变。 

  Observer模式就是解决了这一个问题。 

适用性

       1. 当一个抽象模型有两个方面,其中一个方面依赖于另一方面将这两者封装成独立的对象中以使它们可以各自独立的改变和复用 

       2. 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变 

       3. 当一个对象必须通知其它对象,而它又不能假定其它对象是谁 

参与者 

       1. Subject(目标) 

       目标知道它的观察者,可以有任意多个观察者观察同一个目标 

       提供注册和删除观察者对象的接口 

       2. Observer(观察者) 

       为那些在目标发生改变时需获得通知的对象定义个更新的接口 

       3. ConcreteSubject(具体目标) 

       将有关状态存入各ConcreteObserver对象 

       当它的状态发送改变时,向它的各个观察者发出通知 

       4. ConcreteObserver(具体观察者) 

       维护一个指向ConcreteObserver对象的引用 

       存储有关状态,这些状态应与目标的状态保持一致 

       实现Observer的更新接口是自身状态与目标的状态保持一致 

总结

    观察者模式的核心思想是将数据表示层和逻辑层分离,并定义了稳定的消息传递机制、抽象出调用接口。在需要采用异步通信的应用场景中,合理地运用观察者模式往往会有很好的效果。 

缺陷

    目前本例中的Observer(即本例中的DevListener)只有一个,如果一个Subject(即本例中的DevManager)中注册有大量Observer(即DevManager中存在一个存放DevListener的集合)的话,在广播通知Observer时存在效率问题,毕竟需要遍历集合中所有的Observer。 

 


© 著作权归作者所有

SRain215
粉丝 18
博文 144
码字总数 89414
作品 0
扬州
Android工程师
私信 提问

暂无文章

SpringBoot-MVC RequestBody中LocalDateTime的自适应配置

请求的json报文中可能会出现 一下几种: ['2019-01-01','2019-01-01 12:03:34','20190101120334'] 但是接收的Request实体类日期字段是LocalDateTime类型 LocalDateTime applyDate; 希望的情况......

汉堡OSC
35分钟前
5
0
小招喵所在的国家正处于怪兽入侵的战场中,这个国家一共有n+1个城市

import java.util.Arrays; import java.util.Scanner; public class test3 { public static long max=0;public static void main(String[] args) { Scanner sc = new Scanner(System.i......

南桥北木
36分钟前
4
0
活动策划思维导图模板分享,怎样绘制思维导图操作方法介绍

对于一场活动的举办可以事先使用思维导图简略的将整个过程进行总结归纳使用,这样清晰的思维导图即利于工作的进行,也可以清晰明了了熟悉整个过程,下面是为大家分享的几款活动策划思维导图模...

干货趣分享
43分钟前
5
0
Android高级xml布局之输入框EditText设计

今天给大家介绍一下如何实现一款简约时尚的安卓登陆界面。大家先看一下效果图 当用户输入时动态出现删除按钮 现在先罗列一下技术点: 1.如何使用圆角输入框和按钮背景 2.如何实现“手机号”、...

shzwork
今天
4
0
RxJava进行单元测试的方式

@Test public void completeTask_retrievedTaskIsComplete() { // Given a new task in the persistent repository final Task newTask = new Task(TITLE, ""); ......

SuShine
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部