java适配器模式
前言
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。
例子: 原本系统只支持导出html报表文档,突然增加了需求,需要导出doc和xls文档。
这时可以使用适配器,接入原有的接口中,是原有的接口也能创建出doc和xls文档。
适配器负责产出doc或者xls
1,创建报表顶层接口
定义报表生成接口
public interface ReportDownLoad {
void creatReport(String type,String name);
}
2,更多其他报表接口
public interface EnyReportDownLoad {
//创建doc
public void createDoc(String name);
//创建xls
public void createXls(String name);
}
3,实现其他报表接口
doc的实现
public class DOCReportDownLoad implements EnyReportDownLoad{
@Override
public void createDoc(String name) {
System.out.println("下载报表文件类型:"+"doc" + " "+name+"."+"doc");
}
@Override
public void createXls(String name) {
}
}
xls的实现
public class EXCELReportDownLoad implements EnyReportDownLoad{
@Override
public void createDoc(String name) {
}
@Override
public void createXls(String name) {
System.out.println("下载报表文件类型:"+"xls" + " "+name+"."+"xls");
}
}
4,创建适配器,适配器需实现报表顶层接口
public class ReportAdapter implements ReportDownLoad{
private EnyReportDownLoad report = null;
//根据类型,返回不同的报表创建类
public ReportAdapter(String type){
if(type.equalsIgnoreCase("xls")){
report = new EXCELReportDownLoad();
}else if(type.equalsIgnoreCase("doc")){
report = new DOCReportDownLoad();
}
}
//根据类型,创建报表
@Override
public void creatReport(String type, String name) {
if(type.equalsIgnoreCase("xls")){
report.createXls(name);
}else if(type.equalsIgnoreCase("doc")){
report.createDoc(name);
}
}
}
5,更新原始接口,添加适配器
public class ReportDownLoadService implements ReportDownLoad{
@Override
public void creatReport(String type, String name) {
//原有的html 报表创建
if(type.equalsIgnoreCase("html")){
System.out.println("下载报表文件类型:"+type + " "+name+"."+type);
//新增适配其他两种报表创建方式
}else if(type.equalsIgnoreCase("doc") || type.equalsIgnoreCase("xls")){
ReportAdapter reportAdapter = new ReportAdapter(type);
reportAdapter.creatReport(type,name);
}
}
}
6,测试
public static void main(String[] args) {
ReportDownLoadService report = new ReportDownLoadService();
report.creatReport("xls","我是报表1");
report.creatReport("doc","我是报表2");
report.creatReport("html","我是报表3");
}
结果
下载报表文件类型:xls 我是报表1.xls
下载报表文件类型:doc 我是报表2.doc
下载报表文件类型:html 我是报表3.html
总结
主要解决: 主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,期望它有新的功能,而新环境要求的接口是现对象不能满足的。
系统需要使用现有的类,而此类的接口不符合系统的需要
适配器继承或依赖已有的对象,实现想要的目标接口。