Java中的觀察者模式和監聽者模式都是常用的設計模式,用于實現對象之間的通信。它們的設計思想都是“觀察者”(或“監聽者”)對象觀察(或監聽)主體對象,一旦主體對象發生變化,就通知觀察者(或“監聽者”)對象,讓它們采取相應的行動。
觀察者模式實現了“一對多”的關系,即一個主體對象可以有多個觀察者對象,主體對象發生變化時,所有的觀察者對象都會得到通知。下面是一個Java實現觀察者模式的示例代碼:
// 主體對象 public class Subject { private ArrayListobservers = new ArrayList<>(); public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } // 觀察者對象 public interface Observer { void update(); } // 具體觀察者對象 public class ConcreteObserver implements Observer { private String name; private Subject subject; public ConcreteObserver(String name, Subject subject) { this.name = name; this.subject = subject; subject.attach(this); } public void update() { System.out.println(name + " received notification from subject."); } public void detach() { subject.detach(this); } }
監聽者模式也是實現對象之間的通信,但其與觀察者模式不同的是,監聽者模式中只有一個監聽者對象監聽主體對象,主體對象發生變化時,就通知監聽者對象。下面是一個Java實現監聽者模式的示例代碼:
// 主體對象(被監聽者) public class Subject { private ArrayListlisteners = new ArrayList<>(); public void addListener(EventListener listener) { listeners.add(listener); } public void removeListener(EventListener listener) { listeners.remove(listener); } public void doSomething() { System.out.println("Subject do something."); notifyListeners(new EventObject(this)); } public void notifyListeners(EventObject event) { for (EventListener listener : listeners) { listener.handleEvent(event); } } } // 監聽者對象 public interface EventListener { void handleEvent(EventObject event); } // 具體監聽者對象 public class ConcreteListener implements EventListener { @Override public void handleEvent(EventObject event) { System.out.println("ConcreteListener received event: " + event.toString()); } }
在實際開發中,觀察者模式和監聽者模式都得到了廣泛應用,如Spring開發框架中的事件監聽、Android開發中的廣播機制等都采用了觀察者或監聽者模式。如何選擇哪種模式,取決于項目需求和實際情況。