(本小文只供个人学习记录,如对您有帮助则实属有幸,如有错误也请各位积极指出,万分感谢!)
适配器模式,简单一句总结就是:在不修改原有代码的基础上,将两个完全不相关的类建立某种联系,使之可以相互调用完成协作,
适配器模式有两种实现方案,1)类适配器模式;2)对象适配器模式
给出场景:一个三头插头怎么插在一个两孔插座上?答案是加一个接头适配器,将三头插头转为两头插头插入插座。
直接上代码解释:
先定义一个三头插头:
public interface ThreePower {
void getThreePower();
}
再定义一个两孔插座实现类:
public class TwoPower {
public void getTwoPower(){
System.out.println("*********我提供了两孔插座的电力");
}
}
此时可以引出本次文章的核心问题:如何让三头插头接口的实现类中调用两孔插座实现类里的方法呢?
第一种:类适配器模式
public class ThreeToTwoAdapter extends TwoPower implements ThreePower {
@Override
public void getThreePower(){
System.out.println("*********我是类适配器模式的适配器类");
//this关键字,调用父类中的方法
this.getTwoPower();
}
}
测试:public class MainTest{
public static void main(String[] args){
ThreePower threePower = new ThreeToTwoAdapter();
threePower.getThreePower(); //打印两句话: *********我是类适配器模式的适配器类
*********我提供了两孔插座的电力
}
}
第二种:对象适配器模式
public class ThreeToTwoAdapterObejct implements ThreePower{
private TwoPower twoPower = new TwoPower();
public ThreeToTwoAdapterObejct(TwoPower twoPower){
this.twoPower = twoPower;
}
@Override
public void getThreePower(){
System.out.println("*********我是对象适配器模式的适配器类");
//当前类成员变量代理调用对象方法
twoPower.getTwoPower();
}
}
测试:public class MainTest{
public static void main(String[] args){
TwoPower twoPower = new TwoPower();
ThreePower threePower = new ThreeToTwoAdapterObejct (twoPower);
threePower.getThreePower(); //打印两句话: *********我是对象适配器模式的适配器类
*********我提供了两孔插座的电力
}
}
注:在SpringMVC中,浏览器请求发送到服务器后,SpringMVC是通过对象适配器完成找到具体的Controller的类型的。