适配器模式
适配器模式(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中用的依旧很多。这里提前总结一下,避免遗忘。