一、基礎
觀察者模式
觀察者(Observer)模式又名發佈-訂閱(Publish/Subscribe)模式。GOF給觀察者模式如下定義:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
觀察者
(Observer)將自己註冊到被觀察對象(Subject)中,被觀察對象將觀察者存放在一個容器(Container)裏。
被觀察
被觀察對象發生了某種變化,從容器中得到所有註冊過的觀察者,將變化通知所有觀察者,觀察者們接收變化,如果對該變化感興趣,那麼 進行更新。
撤銷觀察
觀察者告訴被觀察者要撤銷觀察,被觀察者從容器中將觀察者去除。
事件模型
事件是可以被控件識別的操作,如按下確定按鈕,選擇某個單選按鈕或者複選框。每一種控件有自己可以識別的事件,如窗體的加載、單擊、雙擊等事件,文本框的內容改變事件,等等。
事件模型可以使用觀察者模式實現:事件可以作爲作爲觀察者模式中的 被觀察對象的”變化”,觀察者接收所有事件,當對某個事件感興趣時做出變化。
二、Spring中的事件機制
ApplicationListener: 就是我們的Observer,需要到容器中註冊。它要關心它所關心的ApplicationEvent 。一般有如下代碼:
if (event instanceof BlackListEvent) {
}
ApplicationEventMulticaster:是我們Subject的一個代理。它會管理我們的ApplicationListener 。
ApplicationEvent: 是事件,它就是媒介,充當介質的作用。
使用ApplicationEventMulticaster 示例
下面程序中定義了兩個監聽器和兩個事件,開始監聽器只對開始事件作出相應,結束監聽器對結束事件作出響應。
public class Tester {
public static void main(String[] args) {
//構建廣播器
ApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster();
//添加開始監聽器
multicaster.addApplicationListener(new MyStartListener());
//添加結束監聽器
multicaster.addApplicationListener(new MyEndListener());
System.out.println("---發佈開始事件---");
multicaster.multicastEvent(new MyStartEvent(""));//廣播開始事件
System.out.println("---發佈結束事件---");
multicaster.multicastEvent(new MyEndEvent(""));//廣播結束事件
}
public static class MyStartEvent extends ApplicationEvent {
public MyStartEvent(Object source) {
super(source);
}
}
public static class MyEndEvent extends ApplicationEvent {
public MyEndEvent(Object source) {
super(source);
}
}
public static class MyStartListener implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof MyStartEvent ) {
System.out.println("[程序開始監聽器]:程序開始!");
}
}
}
public static class MyEndListener implements ApplicationListener {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof MyEndEvent) {
System.out.println("[程序結束監聽器]:程序結束!");
}
}
}
}
運行結果:
---發佈開始事件---我把裏面的日誌改了下。 原文轉自:https://blog.csdn.net/u011179993/article/details/51487865
[程序開始監聽器]:程序開始!
---發佈結束事件---
[程序結束監聽器]:程序結束!
從這個小例子中可以看出Spring對廣播事件是如何使用的。