1、为什么要有Adapter
- 考虑以下情况,在已有的轮子中以及实现了某一功能,我们的项目只是修改了某一方法,如果要修改全部的代码无疑是困难的且没必要的,这时便出现了适配器(Adapter)模式,我们不需要修改源代码便能得到相同的功能,实现了对资源的重复利用
可以类比生活中的插头适配器来理解,通过适配器能够将两孔的插头插到三孔插座上,并且不影响原功能的正常使用。(图源网络)
Adapter有两种实现方式,两种实现方式是根据原代码中给定的约束不同自主选择的
- 基于继承的适配器
- 基于委托的适配器
2、实现实例
2.1、原接口
public interface Print {
void Print_a();
void Print_b();
}
2.2、新功能
public class Banner {
void print_A() {
System.out.println("---------A-----------");
}
void print_B() {
System.out.println("---------B-----------");
}
}
2.3、基于继承的适配器
在Baner类之上,我们封装一层BannerAdapter类,这里的继承指的是继承Banner类
public class BannerAdapter extends Banner implements Print{
@Override
public void Print_a() {
print_A();
}
@Override
public void Print_b() {
print_B();
}
}
这样即使不改变原代码,也能使用新的Banner内中的功能
public class test {
public static void main(String[] args) {
print(new BannerAdapter());
}
public static void print(Print printer) {
printer.Print_a();
printer.Print_b();
}
}
运行结果:
2.4、基于委托的适配器
与2.3中基于继承不同是,在原代码中,Print是类而不是接口,因此要通过重写方法来实现新功能。
public class Print {
void Print_a() {
System.out.println("---------a-----------");
}
void Print_b() {
System.out.println("---------b-----------");
}
}
通过继承Print类来实现适配。
public class BannerAdapter extends Print {
private static Banner banner=new Banner();
@Override
public void Print_a() {
banner.print_A();
}
@Override
public void Print_b() {
banner.print_B();
}
}
测试:
public class test {
public static void main(String[] args) {
print(new BannerAdapter());
}
public static void print(Print printer) {
printer.Print_a();
printer.Print_b();
}
}
运行结果: