文章目录
observer 观察者模式
oberserver与chain of responsibility 十分相似,也是调用后出发一系列的工作。但是区别在于观察者是更被动的去执行。最常见与经典的应用就是java 中的 swing组件中的时间处理都是采用这种设计模式进行完成的,当然也有叫什么事件驱动或者说消息订阅,我个人觉得都是一回事。针对于观察者来说,最起码需要有三大类的对象才可以叫观察者模式,
- 第一个事件触发者,就是谁触发或者谁发起了事件,
- 第二个就是观察者,有各式各样不同的观察者,等待着事件的处理。
- 第三个就是事件,通常都是指怎么了,干了什么这个动作。
通俗来理解,张三是事件触发者,李四和王五是观察者,比如李四观察张三走了和点头的动作,只要张三走路了或者点头了李四就喊一声;王五只是观察张三点头,张三一点头王五就拍下手。那么在这里张三的点头和走路就是对应的事件。而李四的喊一声就是观察动作后需要执行的动作,王五也同理。
可以通过一个简单的java swing程序来看一下这个observer的执行模式。
public class ObServerJframe extends JFrame {
// 设置一个简单的窗口
ObServerJframe() {
// 布局设置
this.setBounds(20, 20, 500, 200);
// 创造一个按钮
JButton jb = new JButton();
// 添加到窗口中
this.add(jb);
// 构造第一个观察者al1
ActionListener al1 = new ActionListener() {
// 当观察到事件的时候打印hello...
public void actionPerformed(ActionEvent e) {
System.out.println("hello...");
}
};
// 构造第二个观察者al2
ActionListener al2 = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 当观察到事件的时候打印hello...
System.out.println("hi...");
}
};
// 对按钮添加观察者
jb.addActionListener(al1);
jb.addActionListener(al2);
// 设置窗口可见
this.setVisible(true);
}
public static void main(String[] args) {
new ObServerJframe();
}
}
当点击窗口按钮后因为有两个观察者再进行事件监听所以就会调用al1和al2中的方法。jdk的逻辑大致就是
当你addActionListerner的时候会在jbutton对象中将你的观察者保存在一个list对象中,当你需要执行时间的时候根据你的事件类型获取对应的事件列表,并循环列表分别执行里面的方法。添加部分可具体参考AbstractButton 类中源码。执行调用的话没找到呢还。但是大概这个observer就这样了。