作用:适配器(也叫Wrapper-包装器)将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。也就是将“既有内容”转换成“需要结果”,是代码重用的利器之一,Java I/O中应用了这种模式(如ByteArrayInputStream、ByteArrayOutputStream)。形象地:就如同笔记本电脑的电源适配器,一端是220交流电(既有内容),另一端12v直流电(需要结果)。
分类:Adaptor模式有两种,类适配器(继承)、对象适配器(委托) 。两种模式各有优劣,具体在代码解析中说明。
示例-类适配器(继承):
|
电源 |
程序示例 |
既有内容 |
交流电220V |
Banner类(showWithParen,shoWithAster) |
转换装置 |
适配器 |
PrintBanner类 |
需要的结果 |
直流电12V |
Print接口 (PrintWeak,PrintStrong) |
类图查看图片附件:类图-Adapter_1
//------------------------------------------Banner类---------------------------------------------------------------
package adapter;
public class Banner{
private String strings;
public Banner(String strings){
this.strings = strings;
}
public void showWithParen(){
System.out.println("("+strings+")");
}
public void showWithAster(){
System.out.println("*"+strings+"*");
}
}
//------------------------------------------PrintBanner类---------------------------------------------------------------
package adapter;
public class PrintBanner extends Banner implements Print{
public PrintBanner(String strings){
super(strings);//父类构造函数来初始化~~
}
public void printWeak(){
showWithParen();
}
public void printStrong(){
showWithAster();
}
}
//------------------------------------------Print接口---------------------------------------------------------------
package adapter;
public interface Print{
public abstract void printWeak();
public abstract void printStrong();
}
//------------------------------------------测试类---------------------------------------------------------------
public class Main{
public static void main(String[] args){
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
示例-对象适配器(委托):
类图查看图片附件:类图-Adapter_2
//------------------------------------------Banner类---------------------------------------------------------------
同上
//------------------------------------------PrintBanner类---------------------------------------------------------------
package adapter;
public class PrintBanner extends Print{
private Banner banner;
public PrintBanner(String strings){
this.banner = new Banner(strings);
}
public void printWeak(){
banner.showWithParen();
}
public void printStrong(){
banner.showWithAster();
}
}
//------------------------------------------Print类---------------------------------------------------------------
package adapter;
public interface Print{
public abstract class Print{
public abstract void printWeak();
public abstract void printStrong();
}
//------------------------------------------测试类---------------------------------------------------------------
同上