Adapter模式分为以下两种
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
继承的适配器
示例程序类图
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 + "*");
}
}
Print接口
public interface Print {
void printWeak();
void printStrong();
}
PrintBanner类
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
PrintBanner类充当了适配器的角色。它继承了Banner类,继承了showWithParen方法和showWithAster方法。同时,它又实现了Print接口,实现了printWeak方法和printStrong方法。
Main类
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
Main类并不知道PrintBanner类是如何实现的,这样就可以在不用对Main类进行修改的情况下,改变PrintBanner类的具体实现。
委托的适配器
Java中的委托是指将某个方法中的实际处理交给其他实例的方法。
示例程序类图
Print类
public abstract class Print {
public abstract void printWeak();
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 printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
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 + "*");
}
}
Main类
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
Adapter模式中的登场角色
1.Target(对象)
该角色负责定义所需的方法。在示例程序中,由Print接口(使用继承时)和Print类(使用委托时)扮演此角色。
2.Client(请求者)
该角色负责使用Target角色所定义的方法进行具体处理。在示例程序中,由Main类扮演此角色。
3.Adaptee(被适配)
Adaptee是一个持有既定方法的角色。在示例程序中,由Banner类扮演此角色。
如果Adaptee角色中的方法与Target角色的方法相同,就不需要接下来的Adapter角色了。
4.Adapter(适配)
Adapter模式的主人公。使用Adaptee角色的方法来满足Target角色的需求,这是Adapter模式的目的,也是Adapter角色的作用。在示例程序中,由PrintBanner类扮演这个角色。
在适配器模式中,Adapter角色通过继承来使用Adaptee角色,而在对象适配器模式中,Adapter角色通过委托来使用Adaptee角色。
通用类图
Adapter模式用于填补具有不同接口(API)的两个类之间的缝隙。