态度决定高度、企图决定版图、格局决定结局

导航

默认适配模式(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编辑  收藏  举报