观察者模式
2016-07-23 18:34
441 查看
什么是观察者模式? 对象之间的一对一或者一对多的依赖,当一个主题对象发生改变的时候,它的所有依赖者都会收到通知。 直接看这个定义可能看了也是有点不明白什么是观察者模式,那我们用几个生活中的例子来说明下: 大家手机上都用过视频软件吧?当大家有喜欢的电视剧追的时候是不是又一个功能叫订阅?这个其实就是一种观察着模式,当用户点击订阅按钮时就相当于和这个电视剧产生了依赖关系,每当电视有更新的时候就会发通知给你告诉你有新的你就会去看。而像这样的例子生活中有很多,就不一一列举了。二java作为一门面相对象语言,所以很多地方用到了观察者模式,例如android系统本身的广播机制就采用了这种模式,还有如消息的推送也是采用的观察者模式。
那观察着模式具实现方式是怎么样的?接下来我们看看观察者模式的类图
Subject : 主题对象的接口,定义了注册,接触注册以及通知等方法
ProgramConcreteSubject :具体的主题对象,所有的观察者对象都在这里被维护,当其本身发生变化时会通知所有观察者
Observer:观察者接口 ,定义了一个接受主题对象状态变化的接口
PersonObserver:具体观察者对象,维护一个对ProgramConcreteSubject的引用,实现Observer接口,通过update()方法接收主题对象的通知。
所以通过上面的介绍几本了解了其结构,接下来看下具体的代码:
Subject
package demo.arvin.com.androiddemo.observer; /** * Created by arvin on 16/7/23. */ public interface Subject { void notifyAllPerson(); void registerObServer(Observer observe); void unRegisterObServer(Observer observe); }
ProgramConcreteSubject
package demo.arvin.com.androiddemo.observer; import java.util.ArrayList; /** * Created by arvin on 16/7/23. */ public class ProgramConcreteSubject implements Subject { ArrayList<Observer> observerArrayList = new ArrayList<Observer>(); String name =""; @Override public void notifyAllPerson() { for(Observer observer:observerArrayList){ observer.updateNewProgrm(name); } } @Override public void registerObServer(Observer observer) { if(observer != null){ observerArrayList.add(observer); } } @Override public void unRegisterObServer(Observer observer) { if(observer != null){ observerArrayList.remove(observer); } } public void newProgramName(String name){ this.name = name; notifyAllPerson(); } }
Observer
public interface Observer { void updateNewProgrm(String name); }
PersonObserver
package demo.arvin.com.androiddemo.observer; /** * Created by arvin on 16/7/23. */ public class PersonObserver implements Observer { @Override public void updateNewProgrm(String name) { System.out.println("有新的节目:"+name); } }
调用
public static void main(String[] args) { ProgramConcreteSubject subject = new ProgramConcreteSubject(); PersonObserver observer1 = new PersonObserver(); PersonObserver observer2 = new PersonObserver(); subject.registerObServer(observer1); subject.registerObServer(observer2); subject.newProgramName("CCTV"); }
上面就是观察者模式的具体用法,其实不难,但是在实际过程中我们需要判断什么时候需要使用它,主要是当项目中某个对象状态改变而其它某些对象不要根据这个状态做相应的工作就可以用这个模式,那为什么不用其它模式了,其实最大的优点在于,现在的项目由于功能越来越多,很多项目的业务逻辑绑定太紧,造成项目的维护成本高,扩展性不强,而观察模式Subject和Observer之间是松偶合的,分别可以各自独立改变,是项目更容易扩展。
a38d
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树