关于Java的事件监听机制
Spring事件机制是观察者模式的一种实现,但是除了发布者和监听者者两个角色之外,还有一个EventMultiCaster的角色负责把事件转发给监听者。
观察者模式
Spring的事件监听(也称事件驱动)是观察者模式的一种实现,比较常见的有发布-订阅模型。通常我们利用消息队列来实现不同系统之间的解耦,如用户注册完成后,可以向消息队列发布一条消息,然后订阅了此topic的子系统(如邮件服务,积分服务)收到发布的消息之后,就会做相应的处理。这样做的好处是避免了在注册服务里耦合其他服务的代码,并且,执行子系统的业务将会异步执行,互不影响。下图是一个经典的观察者模式的结构。
以下为上述观察者模式的java简单实现:
Subject
9 public abstract class Subject {
10
11 //维护一个所有观察者集合
12 private List<Observer> list = new ArrayList<>();
13
14 //新注册一个观察者
15 public void attach(Observer observer){
16 list.add(observer);
17 System.out.println("新注册一个观察者");
18 }
19
20 //删除一个已注册的观察者
21 public void detach(Observer observer){
22 list.remove(observer);
23 System.out.println("删除一个已注册的观察者");
24 }
25
26
27 //通知所有已经注册的观察者
28 public void notifyObservers(String state){
29 for (int i = 0; i < list.size(); i++) {
30 list.get(i).update(state);
31 }
32 }
33 }
Observer
6 public interface Observer {
7
8 // 抽象出的更新行为
9 public void update(String state);
10 }
ConcreteSubject
6 public class ConcreteSubject extends Subject{
7
8 //真实主题内维护一个状态
9 private String state;
10
11 public String getState() {
12 return state;
13 }
14
15 public void change(String state){
16 this.state = state;
17 System.out.println("真实主题状态变化为:"+state);
18 this.notifyObservers(state);
19 }
20 }
ConcreteObserver
6 public class ConcreteObserver implements Observer {
7
8 //具体观察者的状态
9 private String observerState;
10
11 @Override
12 public void update(String state) {
13 //这里可以根据传递过来的主题的状态作出相应的业务
14 observerState = state;
15 System.out.println("观察者的状态跟着变化为:"+observerState);
16 }
17 }
Main
6 public class Main {
7 public static void main(String[] args)