设计模式之:解剖观察者模式
来源:互联网 发布:sql server 全局变量 编辑:程序博客网 时间:2024/06/05 17:00
本文转自:http://www.iteye.com/topic/102068/
GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下:
1, 观察者(具体执行操作的对象,有多个)
2,被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)
有两个类,java.util.Observable,在我们实现观察者模式的时候,我们的被观察者应该继承这个类,这个observable类把持住了被观察者所持有的观察者列表:
这里只列出了一些常用的操作,大家如有不明白可以自己看java.util包下的Observable,每一个方法前都有详细的解释。但是以上列出的方法对于这个例子来说已经够用了。
当我们自己的被观察者继承这个Observable类是,我们就自动的获取到被观察者的一切条件了。很方便是不是,这也是为什么sun要把Observable放到java.util包中的原因,就是为了方便开发者。
讲完了被观察者再让我们来看看观察者,在上面的代码中有一个addObserver(Observero)方法,由此我们可以看出来,给被观察者添加观察者时就是用这个方法,那么也就是说观察者一定是Observer的子类或者实现,我们看一下java.util.Observer吧:
很好,这是一个接口,接口中就只有一个方法,update,方法中有两个参数,Observable和一个object,第一个参数就是被观察的对象,而第二个参数就得看业务需求了,需要什么就传进去什么。我们自己的观察者类必须实现这个方法,这样在被观察者调用notifyObservers操作时被观察者所持有的所有观察者都会执行update操作了(当然如果你override这个方法,你甚至可以指定何种情况下只执行某种observer了,是不是比较像责任链模式了)。
那么到这里我们也差不多可以把观察者模式应用到项目中去了。首先让我们来实现被观察者(因为实现被观察者非常简单)
首先让我们来实现一个发送邮件的观察者:
接着再让我们来实现一个发送jms消息的观察者:
如上所见,观察者的实现完全跟业务相关。是否复杂就得看你得业务是否复杂了。
public void doBusiness(){ if (true){ super.setChanged(); } notifyObservers("现在还没有的参数"); } public static void main(String [] args) { //创建一个被观察者 Subjectsubject = new Subject(); //创建两个观察者 ObservermailObserver = new MailObserver(); ObserverjmsObserver = new JMSObserver(); //把两个观察者加到被观察者列表中 subject.addObserver(mailObserver); subject.addObserver(jmsObserver); //执行业务操作 subject.doBusiness(); }
1, 观察者(具体执行操作的对象,有多个)
2,被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操)
有两个类,java.util.Observable,在我们实现观察者模式的时候,我们的被观察者应该继承这个类,这个observable类把持住了被观察者所持有的观察者列表:
Java代码
- public
class Observable { -
private boolean changed = false; -
private Vector obs; -
-
//创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。 -
public Observable() { -
obs = new Vector(); -
} -
-
-
public synchronized void addObserver(Observer o) { -
if (o == null) -
throw new NullPointerException(); -
if (!obs.contains(o)) { -
obs.addElement(o); -
} -
} -
-
-
public synchronized void deleteObserver(Observer o) { -
obs.removeElement(o); -
} -
-
-
public void notifyObservers() { -
notifyObservers(null); -
} -
-
-
public void notifyObservers(Object arg) { -
-
Object[] arrLocal; -
-
synchronized (this) { -
if (!changed) -
return; -
arrLocal = obs.toArray(); -
clearChanged(); -
} -
-
for (int i = arrLocal.length-1; i>=0; i--) -
((Observer)arrLocal[i]).update(this, arg); -
} - }
这里只列出了一些常用的操作,大家如有不明白可以自己看java.util包下的Observable,每一个方法前都有详细的解释。但是以上列出的方法对于这个例子来说已经够用了。
当我们自己的被观察者继承这个Observable类是,我们就自动的获取到被观察者的一切条件了。很方便是不是,这也是为什么sun要把Observable放到java.util包中的原因,就是为了方便开发者。
讲完了被观察者再让我们来看看观察者,在上面的代码中有一个addObserver(Observero)方法,由此我们可以看出来,给被观察者添加观察者时就是用这个方法,那么也就是说观察者一定是Observer的子类或者实现,我们看一下java.util.Observer吧:
Java代码
- public
interface Observer { -
-
void update(Observable o, Object arg); - }
- }
很好,这是一个接口,接口中就只有一个方法,update,方法中有两个参数,Observable和一个object,第一个参数就是被观察的对象,而第二个参数就得看业务需求了,需要什么就传进去什么。我们自己的观察者类必须实现这个方法,这样在被观察者调用notifyObservers操作时被观察者所持有的所有观察者都会执行update操作了(当然如果你override这个方法,你甚至可以指定何种情况下只执行某种observer了,是不是比较像责任链模式了)。
那么到这里我们也差不多可以把观察者模式应用到项目中去了。首先让我们来实现被观察者(因为实现被观察者非常简单)
首先让我们来实现一个发送邮件的观察者:
Java代码
-
- public
class MailObserver implements Observer{ -
-
-
public void update(Observable o, Object arg) { -
System.out.println("发送邮件的观察者已经被执行"); -
} - }
接着再让我们来实现一个发送jms消息的观察者:
Java代码
-
- public
class JMSObserver implements Observer{ -
-
public void update(Observable o, Object arg) { -
System.out.println("发送消息给jms服务器的观察者已经被执行"); -
} - }
如上所见,观察者的实现完全跟业务相关。是否复杂就得看你得业务是否复杂了。
接下来让我们再来实现被观察者,示例如下:
Java代码
public class Subject extendsObservable{
}
到此为止,我们已经简单得实现了观察者模式,让我们来运行一下上面main方法,运行结果如下:
发送消息给jms服务器的观察者已经被执行
发送邮件的观察者已经被执行
0 0
- 设计模式之:解剖观察者模式
- 设计模式之:解剖观察者模式
- 设计模式之:解剖观察者模式
- 设计模式之:解剖观察者模式
- 设计模式之:解剖观察者模式
- 设计模式之:解剖观察者模式
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 12枚或者13枚鸡蛋,有一个坏的,用…
- ios地图定位
- 使用REPLACEMENT NEW来调用对…
- LeetCode Linked List Cycle & Linked List Cycle II题解
- 判断点是否在三角形内(来自csdn)
- 设计模式之:解剖观察者模式
- STL之multiset简介
- AsyncTask的用法
- OpenCV 2.3.1 Python&nb…
- Android AssetManager介绍和应用
- 回溯法:子集树与排列树
- NDK Makefile文件中LOCAL_LDL…
- 十几年前,老师感叹,要是所有学生…
- 钻木取火完全攻略——不再是纸上谈兵…