Java中有兩種常見的事件模式:觀察者模式和發布訂閱模式。這兩種模式都是用來處理對象之間的交互的,但是它們有些不同之處。
觀察者模式
public interface Observer { void update(Observable o, Object arg); } public class Observable { private List<Observer> observers = new ArrayList<Observer>(); public synchronized void addObserver(Observer o) { if (!observers.contains(o)) { observers.add(o); } } public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { arrLocal = observers.toArray(); } for (int i = arrLocal.length-1; i>=0; i--) { ((Observer)arrLocal[i]).update(this, arg); } } }
發布訂閱模式
public interface Subscriber { void onMessage(Event event); } public interface Publisher { void addSubscriber(Subscriber subscriber); void removeSubscriber(Subscriber subscriber); void notifySubscribers(Event event); } public class EventPublisher implements Publisher { private List<Subscriber> subscribers = new ArrayList<Subscriber>(); public void addSubscriber(Subscriber subscriber) { subscribers.add(subscriber); } public void removeSubscriber(Subscriber subscriber) { subscribers.remove(subscriber); } public void notifySubscribers(Event event) { for (Subscriber subscriber : subscribers) { subscriber.onMessage(event); } } }
區別
首先,觀察者模式的核心是觀察者(Observer)和可觀察對象(Observable)。觀察者對象會訂閱可觀察對象的事件。當可觀察對象發生改變時,會通知所有的觀察者對象,這樣他們就可以處理這個事件。
而發布訂閱模式的核心是發布者(Publisher)和訂閱者(Subscriber)。發布者對象會維護一份所有的訂閱者的列表,當發布者發生事件時,它會通知所有的訂閱者對象,這些訂閱者對象也可以處理這個事件。
觀察者模式和發布訂閱模式在實現上有一些差異。在觀察者模式中,可觀察對象通常會直接調用觀察者對象的更新方法(update()),而在發布訂閱模式中,發布者對象只會通知訂閱者對象,而不會直接調用它們的方法。
此外,觀察者模式還有一個Observable類,它是Java中的一個標準類。而發布訂閱模式沒有一個標準類,實現方式多種多樣。