如果一个类要实现一个接口,则必须覆写此接口中的全部抽象方法,那么如果一个接口中定义的抽象方法过多,但是在子类中又用不到那么多抽象方法,肯定很麻烦。此时就需要一个中间的过渡,但是此过渡类又不希望被直接使用,所以将此过渡类定义成抽象类最合适,即一个接口首先被一个抽象类先实现(此抽象类即适配器类),并在此抽象类中实现若干方法(方法体为空),则以后的子类直接继承抽象类,就可以有选择地覆写所需要的方法。
interface Window{ public void open(); public void close(); public void activated(); public void iconified(); public void deiconified(); } //定义抽象类实现接口,在此类中覆写方法,但是所有的方法体为空 abstract class WindowAdapter implements Window{ public void activated(){} public void close(){} public void deiconified(){} public void iconified(){} public void open(){} } //子类直接继承WindowAdapter类,有选择地实现需要的方法 class WindowImpl extends WindowAdapter{ public void open(){ System.out.println("打开"); } public void close(){ System.out.println("关闭"); } } public class AdapterDemo{ public static void main(String args[]){ Window win = new WindowImpl(); //实现接口对象 win.open(); } }
因为采用了适配器这个中间环节,所以子类就不用必须实现接口中的全部方法,而是有选择地实现所需要的方法。
在图形界面编程的事件处理中经常用到适配器模式,java提供大量的适配器类来实现大量事件监听接口。