Adapter(适配器模式)
适配器模式用于填补现有程序和所需程序之间的差异
Adapter模式有以下两种
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
类适配器模式(使用继承的适配器)
Paste_Image.png
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 + "*");
}
}
PrintBanner(适配器)
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
Print(需求)
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
对象适配器(使用委托的适配器)
Paste_Image.png
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 + "*");
}
}
PrintBanner(适配器)
//满足Target的需求
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(String string) {
//super(string);
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
Print(需求,Target(对象))
//负责定义所需的方法
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
Main
//Main中不需要知道任何关于Banner的信息
public static void main(String[] args) {
// write your code here
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
什么时候使用Adapter模式
很多时候,我们并非从零开始编程,经常会用到现有的类,特别是当现有的类已经被充分测试过,我们更愿意将这些类作为组件复用,Adapter模式会对现有的类进行适配,生成新的类
使用Adapter可以在完全不改变现有代码的前提下使现有代码适配于新的接口