目录
1.Adapter模式
1.1 作用
在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种用于填补“现有的程序”和“所需的程序”之间差异的设计模式就是Adapter模式。
Adapter模式有以下两种:
①类适配器模式:使用继承的适配器
②对象适配器模式:使用委托的适配器
1.2 示例程序1---使用继承的适配器
1.2.1 示例程序类图
1.2.2 Banner类
作为现在已有的类。
//当前已有的类
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 + "*");
}
}
1.2.3 Print接口
作为想要实现新的需求的接口。
//新的接口,想要能够使用已经实现的类的方法
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
1.2.4 PrintBanner类
作为适配器类,实现了Print接口,因此有新的需求的方法;继承了Banner类,因此可以使用Banner类中已经实现的方法。
//适配器类,通过这个类来使用已经实现的类的方法
public class PrintBanner extends Banner implements Print{
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();//使用继承来的Banner类的方法
}
@Override
public void printStrong() {
showWithAster();
}
}
1.2.5 Main类
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("hello");
p.printWeak();
p.printStrong();
}
}
输出:
1.3 示例程序2---使用委托的适配器
委托是指将某个方法中的实际处理交给其他实例的方法。实例中Banner类和Main类不变,Print从接口变为抽象类,因为只能单一继承,所以此时只能使用委托的方法实现适配。
1.3.1 示例程序的类图
1.3.2 Print抽象类
//新的抽象类,想要能够使用已经实现的类的方法
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
1.3.2 PrintBanner类
//适配器类,通过这个类来使用已经实现的类的方法
public class PrintBanner extends Print{
private Banner banner;//关联对象
public PrintBanner(String string) {
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();//利用banner对象使用Banner类的方法
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
1.4 Adapter模式中的角色
- Target(对象):该角色负责定义所需的方法,即我们当前需要使用的对象。上述的Print。
- Client(请求者):该角色负责使用Target角色所定义的方法进行具体处理。上述的Main。
- Adaptee(被适配):是一个持有既定方法的角色,即已经实现的对象,被适配者。上述的Banner。
- Adapter(适配):该角色负责使用Adaptee角色的方法来满足Target角色的需求。上述的PrintBanner。
- 类适配器模式的类图(使用继承)
- 对象适配器模式的类图(使用委托)
1.5 其他特点
- Adapter模式会对现有的类进行适配,生成新的类,可以实现将现有的类作为新的需求的组件重复使用。
- 使用Adapter模式可以在完全不改变现有代码的前提下使现有代码适配于新的接口。
- 使用Adapter模式可以使新旧版本兼容,帮助同时维护新版本和旧版本。
- 注意:当Adaptee角色和Target角色的功能完全不同时,Adapter模式是无法使用的。
- 比如SpringMVC中的HandlerAdapter适配器,针对不同的自定义方法(新的需求)底层有合适的适配器(调用了已有的方法)来实现,这就用到了适配器模式。
根据图解设计模式书籍进行整理。