应用场景
在程序世界里面,经常会有现有的程序无法直接使用,需要做适当的转换之后才可以使用的情况。而适配器模式就是这种填补差异的设计模式。Adapter同时也被称为Wrapper模式,Wrapper就有包装器的意思。使用精美的包装纸将商品包装成礼物。
- 类适配器模式
Banner类 具体实现了怎么转换 ,目的就是让字符串输出
public class Banner {
private String string;
public Banner(String string)
{
this.string=string;
}
/**
* 显示带括号
*/
public void showWithParen(){
System.out.println("( "+this.string+" )");
}
/**
*显示带星号
*/
public void showWithAster(){
System.out.println("* "+this.string+" *");
}
}
Print接口 一个打印的接口
public interface Print {
public abstract void printParen();
public abstract void printAster();
}
PrintBanner类 真正实现了适配器功能的类
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printParen() {
showWithParen();
}
@Override
public void printAster() {
showWithAster();
}
}
APP
main类并不知道 PrintBanner 类是如何实现这种输出的,这样就可以在不用对Main类进行修改的情况下通过改变 PrintBanner 的具体实现来改变程序的输出结果
public class Main {
public static void main(String[] args) {
Print print = new PrintBanner("你好");
print.printAster();
print.printParen();
}
}
- 对象适配器
Banner类跟上述类一样
下面是Print类 上文把这个声明为一个接口,这里把它写成一个抽象类
public abstract class Print {
public abstract void printParen();
public abstract void printAster();
}
PrintBanner 继承了抽象类,并且创建了Banner的对象,调用了Banner的方法
public class PrintBanner extends Print {
private Banner banner;
@Override
public void printParen() {
banner.showWithParen();
}
@Override
public void printAster() {
banner.showWithAster();
}
}
这个app与上文一样。
- 什么时候使用Adapter
很多时候我们写程序,并不是从零开始写,而是有一些很多 经过过反复测试的类提供给我们自己用。Adapter模式会对现有的类进行适配生成新的类。通过这种模式来创建适合我们自己项目的类,如果出现问题,我们就可以很明确的知道错误在哪!