设计模式之观察者模式(Observer pattern)
2016-05-12 11:27
676 查看
观察者模式(Observer pattern)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.
应用场景:
一、 对一个对象状态的更新,需要其他对象同步更新,而且其他
对象的数量动态可变。
二、 对象仅需要将自己的更新通知给其他对象而不需要知道其他
对象的细节。
源码如下:
//抽象主题角色类
abstract class Subject {
private List list = new ArrayList<>();
public void attach(Observer observer) {
list.add(observer);
}
public void detach(Observer observer) {
list.remove(observer);
}
public void notifyObservers(String newState) {
for (Observer observer : list) {
observer.update(newState);
}
}
}
//具体主题角色类
class SDKDownloadSubject extends Subject {
public void netProcessChange(String data) {
this.notifyObservers(data);
}
}
//抽象观察者角色类
interface Observer {
void update(String state);
}
//具体观察者角色类
class ProgramMonkeyObserver implements Observer {
@Override
public void update(String state) {
System.out.println(Programer look the SDK download process is: +state);
}
}
//客户端
public class Main {
public static void main(String[] args) {
SDKDownloadSubject sdkDownloadSubject = new SDKDownloadSubject();
Observer observer = new ProgramMonkeyObserver();
sdkDownloadSubject.attach(observer);
sdkDownloadSubject.netProcessChange(1%);
sdkDownloadSubject.netProcessChange(51%);
sdkDownloadSubject.netProcessChange(100%);
}
}
观察者模式的优点:
1、 Subject和Observer之间是松偶合的,分别可以各自独立改变。
2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性,极易造成对象间的高度耦合,从而降低了可重用性。
观察者模式的缺陷:
1、 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题,耗时。(毕竟只是简单的遍历),观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.
应用场景:
一、 对一个对象状态的更新,需要其他对象同步更新,而且其他
对象的数量动态可变。
二、 对象仅需要将自己的更新通知给其他对象而不需要知道其他
对象的细节。
源码如下:
//抽象主题角色类
abstract class Subject {
private List list = new ArrayList<>();
public void attach(Observer observer) {
list.add(observer);
}
public void detach(Observer observer) {
list.remove(observer);
}
public void notifyObservers(String newState) {
for (Observer observer : list) {
observer.update(newState);
}
}
}
//具体主题角色类
class SDKDownloadSubject extends Subject {
public void netProcessChange(String data) {
this.notifyObservers(data);
}
}
//抽象观察者角色类
interface Observer {
void update(String state);
}
//具体观察者角色类
class ProgramMonkeyObserver implements Observer {
@Override
public void update(String state) {
System.out.println(Programer look the SDK download process is: +state);
}
}
//客户端
public class Main {
public static void main(String[] args) {
SDKDownloadSubject sdkDownloadSubject = new SDKDownloadSubject();
Observer observer = new ProgramMonkeyObserver();
sdkDownloadSubject.attach(observer);
sdkDownloadSubject.netProcessChange(1%);
sdkDownloadSubject.netProcessChange(51%);
sdkDownloadSubject.netProcessChange(100%);
}
}
观察者模式的优点:
1、 Subject和Observer之间是松偶合的,分别可以各自独立改变。
2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性,极易造成对象间的高度耦合,从而降低了可重用性。
观察者模式的缺陷:
1、 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题,耗时。(毕竟只是简单的遍历),观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
相关文章推荐
- 使用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