在Java中如果要定義事件處理的方式,必須實(shí)作EventListener的子介面,例如實(shí)作 WindowListener來(lái)定義一些視窗事件的處理方式,WindowListener中定義了七個(gè)方法:
可以定義一個(gè)類別來(lái)實(shí)作這個(gè)介面,以完全想要的事件處理,例如:
然而這有個(gè)缺點(diǎn),實(shí)作介面的原則是您必須實(shí)作當(dāng)中所定義的所有方法,即使您對(duì)某些事件並不感興趣,您也必須實(shí)作一個(gè)沒(méi)有內(nèi)容的空方法,代表您已經(jīng)實(shí)作了介面中定義的方法,然而有時(shí),您並不知道介面中到底定義了幾個(gè)方法,或是知道也不知道方法的確切名稱與參數(shù),即使您查了API,在程式中寫下一堆沒(méi)有實(shí)作內(nèi)容的方法也是很煩人的一件事。
WindowAdapter類別預(yù)先實(shí)作了WindowListener介面,每個(gè)方法中都是空的實(shí)作,如下所示:
可以繼承WindowAdapter類別,並重新定義一些您所感興趣的事件,如此一來(lái),就可以避開(kāi)之前所提及的,直接實(shí)作 WindowListener介面的缺點(diǎn),如下所示:
這就是Default Adapter模式,它使用一個(gè)中介的Adapter類別來(lái)將真正感興趣的事件實(shí)作類別,配接至事件處理介面,上面的程式其 UML 圖如下:

將上圖一般化,Default Adapter模式的結(jié)構(gòu)如下所示:
public interface WindowListener extends EventListener {
public void windowOpened(WindowEvent e);
public void windowClosing(WindowEvent e);
public void windowClosed(WindowEvent e);
public void windowIconified(WindowEvent e);
public void windowDeiconified(WindowEvent e);
public void windowActivated(WindowEvent e);
public void windowDecativated(WindowEvent e);
}
public void windowOpened(WindowEvent e);
public void windowClosing(WindowEvent e);
public void windowClosed(WindowEvent e);
public void windowIconified(WindowEvent e);
public void windowDeiconified(WindowEvent e);
public void windowActivated(WindowEvent e);
public void windowDecativated(WindowEvent e);
}
可以定義一個(gè)類別來(lái)實(shí)作這個(gè)介面,以完全想要的事件處理,例如:
public class WindowEventHandler implements WindowListener {
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowClosed(WindowEvent e) {
System.exit(0);
}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDecativated(WindowEvent e) {}
}
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowClosed(WindowEvent e) {
System.exit(0);
}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDecativated(WindowEvent e) {}
}
然而這有個(gè)缺點(diǎn),實(shí)作介面的原則是您必須實(shí)作當(dāng)中所定義的所有方法,即使您對(duì)某些事件並不感興趣,您也必須實(shí)作一個(gè)沒(méi)有內(nèi)容的空方法,代表您已經(jīng)實(shí)作了介面中定義的方法,然而有時(shí),您並不知道介面中到底定義了幾個(gè)方法,或是知道也不知道方法的確切名稱與參數(shù),即使您查了API,在程式中寫下一堆沒(méi)有實(shí)作內(nèi)容的方法也是很煩人的一件事。
WindowAdapter類別預(yù)先實(shí)作了WindowListener介面,每個(gè)方法中都是空的實(shí)作,如下所示:
public abstract class WindowAdapter
implements WindowListener {
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDecativated(WindowEvent e) {}
}
implements WindowListener {
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDecativated(WindowEvent e) {}
}
可以繼承WindowAdapter類別,並重新定義一些您所感興趣的事件,如此一來(lái),就可以避開(kāi)之前所提及的,直接實(shí)作 WindowListener介面的缺點(diǎn),如下所示:
public class WindowEventHandler extends WindowAdapter {
public void windowClosed(WindowEvent e) {
System.exit(0);
}
}
public void windowClosed(WindowEvent e) {
System.exit(0);
}
}
這就是Default Adapter模式,它使用一個(gè)中介的Adapter類別來(lái)將真正感興趣的事件實(shí)作類別,配接至事件處理介面,上面的程式其 UML 圖如下:

將上圖一般化,Default Adapter模式的結(jié)構(gòu)如下所示:
