1.Adapter模式
在程序中,经常会出现有的程序无法直接使用的情况,需要进行适当的变换之后才能使用的情况。这种用于填补现有程序和所需程序之间差异的设计模式就是Adapter模式
Adapter模式也被称为Wrapper模式,有以下两种
(1)类适配器模式(使用继承的适配器)
(2)对象适配器模式(使用委托的适配器)
2.1 示例程序1(使用继承的适配器)
使用了“类适配器模式”的示例程序的类图(使用继承)
Banner类
是现在的实际情况
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithPattern() {
System.out.println("(" + string + ")");
}
public void showWithStar() {
System.out.println("*" + string + "*");
}
}
Print接口
是需求的接口
public interface Print {
void printWeek();
void printStrong();
}
PrintBanner类
扮演适配器的角色。它继承了Banner类,继承了showWithParen方法和showWithAster方法。同时,它又实现了Print接口,实现了PrintWeak方法和printStrong方法
public class PrintBanner extends Banner implements Print{
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeek() {
showWithPattern();
}
@Override
public void printStrong() {
showWithStar();
}
}
Main类
public class Main {
public static void main(String[] args) {
Print print = new PrintBanner("Hello");
print.printWeek();
print.printStrong();
}
}
2.2 示例程序2(使用委托的示例程序)
使用了“对象适配器模式”的示例程序的类图(使用委托)
Print类
public abstract class Print {
public abstract void printWeek();
public abstract void printStrong();
}
PrintBanner类
public class PrintBanner extends Print{
private Banner banner;
public PrintBanner(String string) {
this.banner = new Banner(string);
}
@Override
public void printWeek() {
banner.showWithPattern();
}
@Override
public void printStrong() {
banner.showWithStar();
}
}
3.Adapter模式中的登场角色
Target(对象):该角色负责定义所需的方法。在示例程序中,由Print接口(使用继承时)和Print类(使用委托时)扮演此角色
Client(请求者):该角色负责使用Target角色所定义的方法进行具体的处理。在示例程序中由Main类扮演角色
Adpatee(被适配):是一个持有特定方法的角色。在示例程序中由Banner扮演此角色
Adapter(适配):使用Adpatee角色的方法来满足Tatget角色的需求,这是Adapter模式的目的,也是Adapter角色的作用。在示例程序中,由PrintBanner类扮演角色
4.拓展思路的要点
什么时候使用Adapter模式
很多时候,我们并非从零开始编程,经常会用到现有的类。特别是当前类已经通过充分的测试,BUG很少,而且已经被用于其他软件之中时,我们更愿意将这些作为组件重复利用。
Adapter模式会对现有的类进行适配,生成新的类,通过该模式可以很方便地创建我们所需要的方法群。当出现BUG时,由于我们很明确的知道BUG不在现有的类(Adaptee角色)中,所以只需要调查扮演Adapter角色的类即可,这样一来,代码问题的排查会变的非常简单。
如果没有现成的代码
让现有的类适配新的接口(API)时,使用Adapter模式似乎是理所当然的。不过实际上,我们在让现有的类适配新的接口时,常常会有“只要将这里稍微改一下就可以了”的想法,一不留神就会修改现有的代码。但是需要注意的是,如果对已经测试完毕的代码进行修改,就必须在修改后重新测试。
使用Adapter模式可以完全不改变现有代码的前提下使用现有代码适配与新的接口(API)。此外,在Adapter模式中,并非一定要修改现成的代码,只要知道现有类的功能,就可以编写出新的类
版本升级与兼容性
使用 Adapter 模式可以很好地解决软件版本升级后出现的兼容性问题。