1.adapter模式理论
adapter模式又称变压器模式,关于该模式的基本概念请参考其他书籍或资料;这里我们只粗略讨论该模式两大实现方法的区别:基于类的adapter模式和基于对象的adapter模式。
基于类的adapter模式的一般结构如下:adaptee类为adapter的父类,adaptee类为适配源,适配目标(接口)也是adapter的父类;基于类的adapter模式比较适合应用于adapter想修改adaptee的部分方法的情况。基于对象的adapter模式的一般结构如下:adaptee类对象为adapter所依赖,适配目标(接口)是adapter的父类;基于对象的adapter模式比较适合应用于adapter想为adaptee添加新的方法的情况。但在adaptee类的方法与adapter类的方法不同名而实现相同功能的情况下,我们一般也使用基于对象的adapter模式,在j2se事件处理中,我们就大量使用了基于对象的adapter模式。
2.j2se中的事件处理
j2se中的事件处理代码示例如下:
public class webformdesigner extends jframe { void jbinit() throws exception { text.addactionlistener(new webformdesigner_text_actionadapter(this)); } void text_actionperformed(actionevent e) { textdialog createtext = new textdialog(); createtext.setvisible(true); createtext.settitle("text"); createtext.setbounds(100, 100, 500, 300); createtext.setmodal(true); createtext.show(); } } class webformdesigner_text_actionadapter implements java.awt.event.actionlistener { webformdesigner adaptee; webformdesigner_text_actionadapter(webformdesigner adaptee) { this.adaptee = adaptee; } public void actionperformed(actionevent e) { adaptee.text_actionperformed(e); } } |
在实际编程时,text_actionperformed方法由程序员自己实现(弹出新的对话框),而webformdesigner_text_actionadapter类是由开发环境依据基于对象的adapter模式自动生成的。
3.adapter模式与代码分析
由上面的分析可见,webformdesigner在本例中是adaptee, webformdesigner_text_actionadapter在本例中是adapter, java.awt.event.actionlistener在本例中是适配目标。
适配目标为一接口,代码如下:
public interface actionlistener extends eventlistener { /** * invoked when an action occurs. */ public void actionperformed(actionevent e); } |
适配目标中只有一个方法:actionperformed()。由于webformdesigner_text_actionadapter 实现了java.awt.event.actionlistener,所以要求实现actionperformed()方法。
webformdesigner_text_actionadapter实现actionperformed()方法是引用了webformdesigner这个adaptee而完成的。从代码中可以看出,webformdesigner是webformdesigner_text_actionadapter的方法的参数,所以webformdesigner_text_actionadapter依赖webformdesigner。
adaptee类(webformdesigner)的方法(text_actionperformed)与adapter类(webformdesigner_text_actionadapte)的方法(actionperformed)不同名而实现相同功能,这就是我们上面分析的基于对象的adapter模式。