Java中的觀察者模式和監(jiān)聽者模式都是常用的設(shè)計模式,用于實現(xiàn)對象之間的通信。它們的設(shè)計思想都是“觀察者”(或“監(jiān)聽者”)對象觀察(或監(jiān)聽)主體對象,一旦主體對象發(fā)生變化,就通知觀察者(或“監(jiān)聽者”)對象,讓它們采取相應(yīng)的行動。
觀察者模式實現(xiàn)了“一對多”的關(guān)系,即一個主體對象可以有多個觀察者對象,主體對象發(fā)生變化時,所有的觀察者對象都會得到通知。下面是一個Java實現(xiàn)觀察者模式的示例代碼:
// 主體對象 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); } }
監(jiān)聽者模式也是實現(xiàn)對象之間的通信,但其與觀察者模式不同的是,監(jiān)聽者模式中只有一個監(jiān)聽者對象監(jiān)聽主體對象,主體對象發(fā)生變化時,就通知監(jiān)聽者對象。下面是一個Java實現(xiàn)監(jiān)聽者模式的示例代碼:
// 主體對象(被監(jiān)聽者) 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); } } } // 監(jiān)聽者對象 public interface EventListener { void handleEvent(EventObject event); } // 具體監(jiān)聽者對象 public class ConcreteListener implements EventListener { @Override public void handleEvent(EventObject event) { System.out.println("ConcreteListener received event: " + event.toString()); } }
在實際開發(fā)中,觀察者模式和監(jiān)聽者模式都得到了廣泛應(yīng)用,如Spring開發(fā)框架中的事件監(jiān)聽、Android開發(fā)中的廣播機制等都采用了觀察者或監(jiān)聽者模式。如何選擇哪種模式,取決于項目需求和實際情況。