觀察者模式是一種對象行為型設計模式,它定義了對象之間的一對多依賴關系。
觀察者模式通常用于實現分布式事件處理系統、新聞代理或MVC框架的一部分。在這種模式中,一個對象(稱為“主題”或“可觀察對象”)維護一系列依賴于它的對象(稱為“觀察者”),并在其狀態發生變化時自動通知所有觀察者。這種模式的主要目的是確保觀察者對象在主題對象的狀態改變時得到更新。
觀察者模式-java實現
import java.util.Observable;
import java.util.Observer;public class ObserverPatternDemo {public static void main(String[] args){Subject subject = new Subject();new BinaryObserver(subject);new OctalObserver(subject);new HexaObserver(subject);System.out.println("First state change: 15");subject.setState(15);System.out.println("Second state change: 10");subject.setState(10);}
}class Subject extends Observable {private int state;public int getState() {return state;}public void setState(int state) {this.state = state;setChanged();notifyObservers();}
}class BinaryObserver implements Observer {public BinaryObserver(Subject subject) {subject.addObserver(this);}@Overridepublic void update(Observable o, Object arg) {System.out.println("Binary String: " + Integer.toBinaryString(((Subject) o).getState()));}
}class OctalObserver implements Observer {public OctalObserver(Subject subject) {subject.addObserver(this);}@Overridepublic void update(Observable o, Object arg) {System.out.println("Octal String: " + Integer.toOctalString(((Subject) o).getState()));}
}class HexaObserver implements Observer {public HexaObserver(Subject subject) {subject.addObserver(this);}@Overridepublic void update(Observable o, Object arg) {System.out.println("Hex String: " + Integer.toHexString(((Subject) o).getState()).toUpperCase());}
}
在這個例子中,我們創建了一個Subject類,它繼承了Java內置的Observable類,并且在Subject類中定義了一個狀態state。當Subject類的狀態發生改變時,會調用setChanged()方法和notifyObservers()方法來通知觀察者。BinaryObserver、OctalObserver和HexaObserver是觀察者類,它們在構造函數中注冊到Subject類中。當Subject類的狀態發生改變時,它們會接收到通知并且自動更新。
Spring的事件機制的基本概念
Spring的事件機制是Spring框架中的一個重要特性,基于觀察者模式實現,它可以實現應用程序中的解耦,提高代碼的可維護性和可擴展性。Spring的事件機制包括事件、事件發布、事件監聽器等幾個基本概念。其中,事件是一個抽象的概念,它代表著應用程序中的某個動作或狀態的發生。事件發布是事件發生的地方,它負責產生事件并通知事件監聽器。事件監聽器是事件的接收者,它負責處理事件并執行相應的操作。在Spring的事件機制中,事件源和事件監聽器之間通過事件進行通信,從而實現了模塊之間的解耦。以下是使用方法:
- 通過繼承ApplicationEvent,實現自定義事件。是對 Java EventObject 的擴展,表示 Spring 的事件,Spring 中的所有事件都要基于其進行擴展。
public class MyEvent extends ApplicationEvent {private String name;public MyEvent(Object source, String name) {super(source);this.name = name;}@Overridepublic String toString() {return "MyEvent{" +"name='" + name + '\'' +"} " + super.toString();}
}
- 接下來通過事件發布器將事件發布出去。Spring 中事件發布器有專門的接口 ApplicationEventPublisher:
public interface ApplicationEventPublisher {default void publishEvent(ApplicationEvent event) {publishEvent((Object) event);}void publishEvent(Object event);
}
- 事件發布方式如下:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);
ctx.publishEvent(new MyEvent(new Demo(), "javaboy"));
- 實現監聽器,事件監聽器有兩種定義方式。
- 實現接口
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {System.out.println("event = " + event);}
}
- 注解:
@Component
public class MyEventListener {@EventListener(value = MyEvent.class)public void hello(MyEvent event) {System.out.println("event02 = " + event);}
}
Spring框架的事件處理機制適用場景
- 業務狀態變化通知:當應用程序中的某個業務狀態發生變化時,可以通過Spring事件機制通知所有感興趣的組件。例如,用戶注冊成功后,可以發布一個事件通知其他系統進行相應的處理,如發送歡迎郵件、更新用戶統計信息等。
- 異步消息處理:在需要處理大量數據或執行耗時操作時,可以利用事件機制進行異步處理。這樣可以避免阻塞主線程,提高系統的響應速度和吞吐量。
- 組件間的松耦合通信:Spring事件機制允許不同的組件之間進行通信而不需要直接依賴對方。這種松耦合的設計使得組件可以獨立地開發、測試和部署,有助于提高系統的整體穩定性。
- 插件式架構支持:對于需要支持插件或模塊擴展的應用程序,事件機制提供了一個標準化的方式來讓插件參與到主程序的運行流程中,而無需修改主程序的代碼。
- 系統集成與擴展:在進行系統集成或添加新功能時,事件機制可以作為一種靈活的擴展手段,通過定義新的事件和監聽器來集成外部服務或增加新的業務邏輯。
- 錯誤處理與監控:在應用程序運行過程中,可能會遇到各種錯誤或異常情況。通過事件機制,可以將錯誤信息封裝成事件并發布,然后由專門的錯誤處理組件來監聽和處理這些事件,從而實現集中式的錯誤處理和監控。
- 跨服務通信:在微服務架構中,不同服務之間可以通過事件機制來進行通信,實現服務的解耦和靈活交互。