适配器模式将对象适配成用户需要的一种表现形式,目的是消除由于对象不匹配而导致的兼容性问题。主要分为三类:类的适配器模式,方法的适配器模式及接口的适配器模式。
我们先讲场景,其实适配器模式非常常见,比如jdbc对各种数据库的适配,比如SpringMvc对Handle的适配,由于HandleMapping,HandleAdapter这个案例不是太好理解,这里我们为了更好的诠释适配器模式,可以俗一点,找个通用案例:电压适配,比如说,我们正常民用电是220V电压,那么很多电器充电需要5V电压,那么就需要用电压适配器转换一下,好了下面进入案例。
一、类适配器模式:
Target是客户希望的表现形式,我们可以为电器提供220V和5V的电压。
Adaptee是我们需要适配的类,是220V电压。
ClassAdapter是我们的适配器,适配220V电压到5V。
public class Adaptee {
public void outPutAc220V(){
System.out.println("输出220V电压");
}
}
public interface Target {
public void outPutAc5V();
public void outPutAc220V();
}
public class ClassAdapter extends Adaptee implements Target {
@Override
public void outPutAc220V() {
super.outPutAc220V();
}
@Override
public void outPutAc5V() {
System.out.println("输出5V电压");
}
}
public class Test {
public static void main(String[] args) {
Target target = new ClassAdapter();
target.outPutAc5V();
((ClassAdapter) target).outPutAc220V();
}
}
二、方法适配器模式:
代码:
除了Adapter有变化,其他两个类都跟类适配器一样,此处不重复贴,只上方法适配器代码。
public class MethodAdapter implements Target{
private Adaptee adaptee;
public MethodAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void outPutAc5V() {
System.out.println("输出5V电压");
}
public void outPutAc220V() {
adaptee.outPutAc220V();
}
}
public class Test {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target1 = new MethodAdapter(adaptee);
target1.outPutAc220V();
target1.outPutAc5V();
}
}
三、接口适配器模式
设计原则里有个接口隔离原则,子类不需要的接口就不用实现,在这边也是这个作用。子类无需实现自己不需要的接口。
作为人类,可以有很多技能,例如主持,开车,编程;所谓术业有专攻,主持人就专心的实现主持的技能,司机专心提升开车技巧,同理,程序猿需要努力提升自己的编码能力。上代码;
public interface Human {
void speak();
void drive();
void coding();
}
public abstract class Swapper implements Human{
@Override
public void speak() {}
@Override
public void drive() {}
@Override
public void coding() {}
}
public class Driver extends Swapper {
@Override
public void drive() {
System.out.println("努力提升驾驶技巧");
}
}
public class SoftwearEngineer extends Swapper{
@Override
public void coding() {
System.out.println("努力提升编程技巧");
}
}
public class Test {
public static void main(String[] args) {
Swapper driver = new Driver();
driver.drive();
}
}