Java觀察者模式和監(jiān)聽(tīng)器都是用來(lái)實(shí)現(xiàn)對(duì)象間的事件通知機(jī)制,可以讓多個(gè)模塊之間彼此獨(dú)立,降低耦合度。兩者雖然基本思想相似,但實(shí)現(xiàn)方式略有不同。
Java觀察者模式是一種設(shè)計(jì)模式,通過(guò)定義一個(gè)被觀察者對(duì)象和多個(gè)觀察者對(duì)象來(lái)實(shí)現(xiàn)事件的通知。被觀察者有一個(gè)集合,放置所有注冊(cè)的觀察者,當(dāng)被觀察者狀態(tài)改變時(shí),會(huì)遍歷這個(gè)集合,調(diào)用每個(gè)觀察者的update()方法來(lái)進(jìn)行通知。以下是一個(gè)簡(jiǎn)單的例子:
public class Subject { private List<Observer> observers = new ArrayList<Observer>(); public void attach(Observer observer) { observers.add(observer); } public void notifyAllObservers() { for (Observer observer : observers) { observer.update(); } } } public abstract class Observer { protected Subject subject; public abstract void update(); } public class ConcreteObserver extends Observer { public ConcreteObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } public void update() { System.out.println("Subject state changed."); } } public class Main { public static void main(String[] args) { Subject subject = new Subject(); new ConcreteObserver(subject); subject.notifyAllObservers(); } }
監(jiān)聽(tīng)器是一種廣泛應(yīng)用于界面編程的事件機(jī)制,主要用于按鈕、文本框、滾動(dòng)條等控件的使用。事件源(如按鈕)會(huì)在事件觸發(fā)時(shí)調(diào)用事件監(jiān)聽(tīng)器(如按鈕監(jiān)聽(tīng)器)中的方法,該方法會(huì)在事件發(fā)生時(shí)做出響應(yīng)。以下是一個(gè)簡(jiǎn)單的例子:
public class MainFrame extends JFrame { private JButton button; public MainFrame() { button = new JButton("Click me!"); add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Button clicked."); } }); } }
在使用時(shí),觀察者模式主要用于對(duì)象間的事件通知,而監(jiān)聽(tīng)器主要用于界面編程的事件響應(yīng)。兩者各有優(yōu)缺點(diǎn),需要根據(jù)實(shí)際需求進(jìn)行選擇。