Adapter即适配器,可以类比为将220V的电压的电源转为5V电压的手机充电器,起转换的作用。
-
明确概念:
Adaptee:被适配者,即220v电压的电源
Adapter:适配器,即手机充电器
Target:适配目标,即输出5V电压
Client:请求适配者,即手机 -
Adapter模式有两种实现:
- 使用继承的适配器。
类图
代码
//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 + "*");
}
}
//Target
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
//Adapter
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
//Client
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
- 使用委托的适配器。
类图
代码
//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 + "*");
}
}
//Target
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
//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();
}
}
//Client
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
-
两种实现方式的区别
Adapter根据不同的Target类型分别进行实现。如果Target是接口,那Adapter就继承Adaptee,使用Adaptee的方法实现Target的方法。如果Target是抽象类,那Adapter就在自己内部创建Adaptee对象,继承Target类,调用Adaptee对象的方法实现Target类的方法。 -
为什么使用这种模式
很多时候,我们不是从零开始编程的,要尽量复用现有的经过充分测试的类。此时使用Adapter模式对这个类进行适配,借用这个类的已有方法开发新功能,减轻测试负担。
还有更多的应用场景,比如提高与旧版本的兼容性。但我现在还不能完全理解。