Java是一種面向對象的編程語言,它的事件和委托機制為Java程序提供了更加靈活的事件處理方式。
//Java事件的實現方式 public interface ActionListener { public void actionPerformed(ActionEvent e); } public class JButton extends AbstractButton implements Accessible { public void addActionListener(ActionListener listener) { listenerList.add(ActionListener.class, listener); } protected void fireActionPerformed(ActionEvent event) { Object[] listeners = listenerList.getListenerList(); for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == ActionListener.class) { ((ActionListener) listeners[i + 1]).actionPerformed(event); } } } } public class Test { public static void main(String[] args) { JButton button = new JButton("Click me"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Button clicked"); } }); } }
在Java事件機制中,事件對象(例如ActionEvent)通過事件源(例如JButton)傳遞給監聽器(例如ActionListener)。當事件源上發生某個特定的動作(例如單擊按鈕)時,它會創建一個事件對象并將其傳遞給所有注冊的監聽器。
Java委托機制是Java語言實現事件機制所采用的一種設計模式。通過委托機制,事件源和事件監聽器之間的耦合度得到了很大的降低,這使得Java程序的可維護性和可擴展性得到了很大的提高。
//Java委托的實現方式 public class EventSource { public void addEventListener(EventListener listener) { listenerList.add(EventListener.class, listener); } public void removeEventListener(EventListener listener) { listenerList.remove(EventListener.class, listener); } protected void fireEvent(EventObject event) { Object[] listeners = listenerList.getListenerList(); for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == EventListener.class) { ((EventListener) listeners[i + 1]).handleEvent(event); } } } } public interface EventListener extends java.util.EventListener { public void handleEvent(EventObject event); } public class Test { public static void main(String[] args) { EventSource eventSource = new EventSource(); eventSource.addEventListener(new EventListener() { public void handleEvent(EventObject event) { System.out.println("Something happened"); } }); //... eventSource.fireEvent(new EventObject(this)); } }
在Java委托機制中,事件源(例如EventSource)維護了一個事件監聽器列表(例如listenerList),事件監聽器(例如EventListener)向事件源注冊,當事件源觸發某個事件(例如EventObject)時,它會將事件對象傳遞給所有注冊的事件監聽器,并調用它們的處理方法(例如handleEvent())。