适配器的英文是Adapter,意思是“使......相互适合的东西”。它位于实际情况与需求之间,填补两者之间的差异。
Adapter模式分为两种:
1、类适配器模式(使用继承的适配器)
电源的比喻 | 示例程序 | |
实际情况 | 交流100伏特 | Banner类(showWithParen、showWithAster) |
变换装置 | 适配器 | PrintBanner类 |
需求 | 直流12伏特 | Print接口(printWeak、printStrong) |
public class Banner {
private String string;public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
Print接口:(Target)
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner类:(Adapter)
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
public void printWeak() {
showWithParen();
}
public void printStrong() {
showWithAster();
}
}
Main类:
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
2、对象适配器模式(使用委托的适配器)
Banner类:(Adaptee)
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
Print类:(Target)
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner类:(Adapter)
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(String string) {
this.banner = new Banner(string);
}
public void printWeak() {
banner.showWithParen();
}
public void printStrong() {
banner.showWithAster();
}
}
Main类:
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
Adapter类是使用Adaptee角色的方法来满足Target角色的需求
使用:很多时候,我们并非从零开始编程,经常会用到现有类,Adapter模式会对现有的类进行适配,生成新的类。相当于我们已经有Adaptee角色,只需适配生成Adapter角色。
缺点:当Adapter角色与Target角色的功能完全不同时,Adapter模式是无法使用的。