适配器模式总结

适配器模式

适配器模式(Adapter)从其名字就可以看出这个设计模式的作用,适配器模式——将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

系统的数据和行为都正确,但是接口不符的时候,我们可以使用适配器模式,目的是是控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用与希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

已经有些不错的博客,总结的非常通俗了Java 适配器模式使用场景,这里在这篇博客的基础上,优化一下实例,完成总结

实现适配器模式主要有两种方式,一种是继承,另一种是维护一个引用(组合的方式)

1.继承的方式实现适配

实例依旧采用上述文章中的实例:手中有一个ps2的接口,但是电脑只有USB接口,现在就需要进行接口的转换和适配

详细类图如下:


其中的PS2USBAdapter通过继承至USBImplements的方式来完成适配,实现PS2接口的目的是为了让客户端调用的时候,依旧适用PS2接口

各个代码如下:

USB接口和UsbImplement

public interface USB {
    public void useUsb();
}
public class UseImplement implements USB{
    @Override
    public void useUsb() {
        System.out.println("USB is working");
    }
}

PS2接口

public interface PS2 {
    public void usePS2();
}

PS2USBAdapter适配器

public class PS2USBAdapter extends UseImplement implements PS2{

    @Override
    public void usePS2() {
        System.out.println("PS2USB适配器转换中......");
        super.useUsb();
    }
}

客户端调用

public class Client {
    public static void main(String[] args) {
        //获得适配器
        PS2 ps = new PS2USBAdapter();
        ps.usePS2();

    }
}

运行结果:


2、通过组合的方式来完成适配

这个和上面的实例区别不大,上面的实例在编写适配器类的时候,采用的是继承的方式,而这里不会用到继承,而是在适配器类中维护一个USBImplement的引用,达到相同的效果


这里就只贴出适配器的代码,其他代码一样

public class PS2USBAdapterNotByExtends implements PS2{

    private USB usb = new UseImplement();

    @Override
    public void usePS2() {
        System.out.println("PS2USB适配器转换中......");

        //调用目标接口的方法
        usb.useUsb();
    }
}

运行结果和上面一样

上述博文中还提到了第三种方式,其实第三种方式,主要是考虑到适配器的类通过实现接口的方式,必须要全部实现目标接口的所有方法,这样有点臃肿,因此在适配器转换类和目标接口之间加入了一个抽象类,抽象类实现目标接口,将方法变得抽象,适配器类根据需要继承实现抽象类,这样就可以根据需要来实现部分方法适配了,其实这实质也是通过继承的方式来完成的。这里就不再深入探讨该实例了。

实际开发中用到适配器模式的地方有很多,比如各种登录方式,在原有的登录方式上进行适配(后期会加入一个这样的简单实例),适配器模式更多的是在原有的代码上做出适配和维护,类似有点打补丁的意思。但是其在Spring中用的依旧很多。这里提前总结一下,避免遗忘。

猜你喜欢

转载自blog.csdn.net/liman65727/article/details/79729820