默认适配模式(Default Adapter)
在研究SQLCenter中,碰到了这个模式的具体运用,非常有启发。分享一下我的体会。
在看了很多模式介绍的blogs上,似乎都没有提及这个模式,从<Java与模式>中发现了这个模式影子。
这个例子的使用似乎不是那么的常用,加之又是Adapter的一个特例,所以相关文章比较少。
但是从sqlcenter的运用中,我感觉到这个模式的力量还是巨大的。
1。模式的意图:
为了使原本因为接口不同而不能一起工作的类,通过一中间层的适配,达以共同工作。
很显然这就是Adapter的意图。
但是很多情况下,我们见到的接口不同不能一起工作,是指接口方法签名不一致原因造成的。而Default Adapter模式则不完全如此。
它特殊的地方在于,我们不需要实现适配接口提供的所有方法。说个例子:
interface Istudent
{
void Study();
void DoHomeWork();
void Play();
}
但是出现了一个张三学生,他不读书,不做作业.那么我们会有这样的一个实现:
class StudentZhang:IStudent
{
public void Study(){}
public void DoHomeWork(){}
public void Play(){WL("Play Play Play")};
}
上面的空实现是不是很不爽?是的.但是如果不用空实现,程序根本不能通过编译.
怎么办呢?这个时候就出现了Default Adapter 模式.她用来完成这个伟大的"中间层",通过这样一个中间层适配来协调这个问题.
是不是感觉到和普通的Adapter模式的点点特别.但是思想没有变化:通过增加中间层,来协调一组类协同工作.
看看Default Adapter模式为我们提供了什么?
通过增加的中间层,就是抽象学生类,作为系统的默认学生出现.
这样的设计不仅解决了类协同工作问题,还解决了空方法实现的不优雅.
在Java语言中,Applet开发时经常遇到这样的代码:
//这是窗口事件定义
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 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) {}
}
//如果不用的方法被别人代替搞定就好了,WindowAdapter的出现就是完成这个认为的
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) {}
}
//我现在要干的,简单,舒服多了!
public class WindowEventHandler extends WindowAdapter {
public void windowClosed(WindowEvent e) {
System.exit(0);
}
}
小结下:
Default Adapter的实现:
通过中间一层抽象类,去完成系统的默认实现功能,为默认适配。这里的适配层完全可以有自己的默认实现。这也就是SqlCenter的运用之处。在适配层中增加自己的实现,当添加新的实体,但是又无对应生成器时,就通过这个默认实现来代替。似乎应该有个叫默认代理的模式才对。模式适配和代理模式应该是有非常多的相似之处。留明天继续学习!
posted on 2006-10-22 21:42 flyingchen 阅读(2512) 评论(15) 编辑 收藏 举报