适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
适配器模式有以下两种:
1、类适配器模式(使用继承的适配器);
2、对象适配器模式(使用委托的适配器);
第一种示例:
Banner.java
package com.test.dp.adapter;
//具体实现,代表“实际情况”
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParent() {//第一种
System.out.println("(" + string + ")");
}
public void showWithAster() {//第二种
System.out.println("*" + string + "*");
}
}
Print.java
package com.test.dp.adapter;
//代表“需求”的接口
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner.java
package com.test.dp.adapter;
//适配器
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
public void printWeak() {
showWithParent();
}
public void printStrong() {
showWithAster();
}
}
第二种示例:
Print1.java
package com.test.dp.adapter;
public abstract class Print1 {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner1.java
package com.test.dp.adapter;
//适配器
public class PrintBanner1 extends Print1 {
private Banner banner;
public PrintBanner1(String string) {
this.banner = new Banner(string);
}
public void printWeak() {
banner.showWithParent();
}
public void printStrong() {
banner.showWithAster();
}
}
mian方法:
Main.java
package com.test.dp.adapter;
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("类适配器");
p.printWeak();
p.printStrong();
Print1 p1 = new PrintBanner1("方法适配器");
p1.printWeak();
p1.printStrong();
}
}
执行结果:
(类适配器)
*类适配器*
(对象适配器)
*对象适配器*
总结:
优点:1、可以让任何两个没有关联的类一起运行。2、提高了类的复用。3、增加了类的透明度。4、灵活性好。
缺点:1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。