结构模式之适配器模式注解

适配器模式分为两种,一种是类的适配器,另一种是对象的适配器。适配器模式存在的原因是原来的系统中使用了一个接口Target,其要求里面含有若干方法,而新加入的一个类中含有的方法不足,或者需要增强一些新加入的类的方法的功能。此时就不能直接将新加入的类进行调用,而是通过一个适配器类,将新加入的类改写成目标接口所要求的样子,这样通过调用适配器类就可以间接地调用新加入的类了。

类的适配器的UML图如下:


类的适配器是通过将新引入的适配器类Adapter继承要加入的新类Adaptee,同时Adapter实现共同接口Target得以将Adaptee适配成Target的要求。

下面为类的适配器的参考代码:

目标接口Target的参考代码如下:

//整个系统已经设计好了的需要提供的目标接口

public interface Target {

    voidsampleOperation1();

    voidsampleOperation2();

}

想要新加入的类Adaptee(也叫源类)的参考代码如下:

public class Adaptee {

    //自己本身拥有一个方法,但达不到Target的要求

    public void sampleOperation1(){}

}

适配器类Adapter的参考代码如下:

public class Adapter extends Adaptee implements Target {

    //加入源类没有的方法

    public voidsampleOperation2(){

        // Write your code here

    }

}

从上面的代码可以看出,新加入的类Adaptee是不能被修改的,我们能修改的是Adapter类,这种情况下通常是因为Adaptee是由其他人提供的类,我们将其加入时,不能够直接修改其源代码,而只能是通过继承关系引入一个适配器类Adapter进行继承Adaptee中的方法,同时实现Target要求的接口,这样就可以直接通过加入Adapter类从而可以实现Adaptee的加入。

对象的适配器模式是通过新加入的适配器类Adapter中加入一个对源类Adaptee对象的引用,再重写其方法进行调用实现的,其UML类图如下:


下面为对象的适配器模式的参考代码:

目标接口Target的参考代码如下:

public interface Target {

    voidsampleOperation1();

    voidsampleOperation2();

}

源类Adaptee的参考代码如下:

public class Adaptee {

    public voidsampleOperation1(){}

}

适配器类参考代码如下:

public class Adapter implements Target {

    private Adaptee adaptee;

    public Adapter(Adapteeadaptee){

        this.adaptee = adaptee;

    }

    public voidsampleOperation1(){

    //对源类对象的引用调用,可以在调用前后进行增强

        adaptee.sampleOperation1();

    }

 

    public voidsampleOperation2(){

        // Write your code here

    }

}

在对象的适配器模式中,源Adaptee这类中的sampleOperation1()方法名是可以随便取的,因为在适配器Adapter中的有一个sampleOperation1()方法满足要求了,只要在这个Adapter中的sampleOperation1()中调用对应的Adaptee中的对应方法就可以了,一样达到效果,所以不要认为对象的适配器模式一定要求源Adaptee的方法一定要与Target中要求的某个方法一样。

在使用适配器模式中,对源类Adaptee中原有的方法不管是类的适配器还是对象的适配器,都是可以进行增强的,比如在类的适配器中覆盖Adaptee中的方法,在覆盖的方法里面加入增强的代码同时再调用作为基类的Adaptee中对应的方法就可以达到增强功能的目的。同时对象的适配器也是可以的。

另外在这个模式中,新加入的适配器中加入的新的方法,比如sampleOperation2这个方法,其实在实现中,似乎没有大太意义,但是却又是目标对象Target所要求的必须实现的接口,这种情况下,通常可以通过提供一个默认适配器类,进行一个默认实现。这个默认适配器类默认实现了目标Target中的所有方法,这样当要新加入一个适配器类Adapter时,就可以直接从默认适配器类中进行继承,那样就可以不用写一些不必要的方法了,因为通过继承得以拥有该拥有的方法,然后再引用新加入的源类Adaptee即可。在采用默认适配器这种方法中,只能采用对象的适配器,而不能采用类的适配器方法,因为一个类不能同时继承多个类。


阅读更多
文章标签: interface class uml
个人分类: 设计模式
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭