设计模式学习(十三):观察者模式
作者:Grey
原文地址:
观察者模式
观察者模式是一种行为型模式。在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。
一般可以用做事件处理往往和责任链模式搭配使用, 举个例子:
界面上的按钮上一般都可以绑定事件,当我们按下按钮的时候,可以触发这些事件的执行,这里就可以用观察者模式来做, 我们先定义按钮这个对象
public class Button { private List<ActionListener> listeners = new ArrayList<>(); public void addActionListener(ActionListener listener) { this.listeners.add(listener); } @Override public String toString() { return "Button{" + "listeners=" + listeners + '}'; } public void buttonPressed() { ActionEvent event = new ActionEvent(System.currentTimeMillis(), this); listeners.forEach(item -> item.actionPerformed(event)); } }
由上可知,Button 中持有了一个列表,这个列表里面装的就是所有事件的列表,我们可以把事件绑定到这个按钮的事件列表中,这样就可以实现按钮执行 press 操作的时候,把对应的事件触发执行了
public interface ActionListener { void actionPerformed(ActionEvent event); }
模拟两个监听事件
public class Listener1 implements ActionListener { @Override public void actionPerformed(ActionEvent event) { System.out.println("Listener 1 listened it source: [" + event.getSource() + "], when is [" + event.getWhen() + "]"); } }
public class Listener2 implements ActionListener { @Override public void actionPerformed(ActionEvent event) { System.out.println("Listener 2 listened it source: [" + event.getSource() + "], when is [" + event.getWhen() + "]"); } }
主方法在调用的时候,将按钮绑定上述两个监听事件:
public class Main { public static void main(String[] args) { Button button = new Button(); button.addActionListener(new Listener1()); button.addActionListener(new Listener2()); button.buttonPressed(); } }
当执行
button.buttonPressed()
的时候,对应的 listener1 和 listener2 就可以执行了。
上述过程的 UML 图如下
观察者模式的应用
-
邮件订阅、RSS Feeds,本质上都是观察者模式。