设计模式之观察者模式
2015-11-03 22:38
357 查看
在一个系统中,模块与模块、类与类之间都是相互关联的,一种很常见的情况是,当有某种状态发生变化时,其他的几个模块或者几个类也进行相应变化。(突然想到了android的广播机制,怀疑广播功能的实现也是用这种模式)
观察者模式就是用来满足这种需求,并让类与类之间松耦合的。简单的说,观察者需要向被观察者注册,表示我希望监听被观察者的某种状态,当状态变化的时候请主动通知我。
因此在实现时,被观察者需要维护一个观察者的列表,当被观察者的状态发生变化时,依次调用被观察者的函数。于是类的结构也就很明显了,主要由四个部分组成:IObserver,concreteObserver,
以上就是整个的代码结构。
上述代码中,当被观察者发生变化时,它将全部信息发给每个观察者,好像是它知道每个观察者都需要的东西,这种有点像推送模型,不管需不需要都推出去。还有一种方式是拉取,就是观察者可以根据自己的需求来获取内容,解决方案就是:将update(…..)中改为update(this);也就是将整个的被观察者对象都发送给观察者。
在Java里面,集成了对观察者模式的支持,请参考Observer接口和Observable类。
但这里面还存在一个问题:就是观察者都要有一个update()方法,那如果没有这个方法呢?但是也需要进行监听处理?据说存在一种事件的机制,,我没有搞懂。。。
观察者模式就是用来满足这种需求,并让类与类之间松耦合的。简单的说,观察者需要向被观察者注册,表示我希望监听被观察者的某种状态,当状态变化的时候请主动通知我。
因此在实现时,被观察者需要维护一个观察者的列表,当被观察者的状态发生变化时,依次调用被观察者的函数。于是类的结构也就很明显了,主要由四个部分组成:IObserver,concreteObserver,
Subject,concreteSubject; Interface IObserver{ public void update(); } class concreteObserver implements IObserver{ public void update(......){ ,.............. } } class Subject{ List<IObserver> list = new ArrayList<>(); public void attach(IObserver observer){//注册新的观察者 list.add(observer); } public void detach (IObserver observer){ list.remove(observer);//移除观察者 } public void notify(){ for(IObserver observer:list){ observer.update(....); } } } class ConcreteSubject extends Subject{ 。。。。 public void change(){ ... notify();//通知所有的观察者 } }
以上就是整个的代码结构。
上述代码中,当被观察者发生变化时,它将全部信息发给每个观察者,好像是它知道每个观察者都需要的东西,这种有点像推送模型,不管需不需要都推出去。还有一种方式是拉取,就是观察者可以根据自己的需求来获取内容,解决方案就是:将update(…..)中改为update(this);也就是将整个的被观察者对象都发送给观察者。
在Java里面,集成了对观察者模式的支持,请参考Observer接口和Observable类。
但这里面还存在一个问题:就是观察者都要有一个update()方法,那如果没有这个方法呢?但是也需要进行监听处理?据说存在一种事件的机制,,我没有搞懂。。。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories