前言
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能,适配器如电脑的电源适配器就是一个例子,能够自动转化适应不通的电源进行充电。
一、适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。对于代码的改造尽量复用原来的接口,继承原来的接口实现新的功能。
二、使用步骤
以读取文件为例子,读取不通格式的文件 。
类图如下:
1.简单文件读取接口与多文件读取接口
代码如下(示例):
/**
* 文件读取
*/
public interface FilerReader {
void readFile(String fileType,String filePath);
}
/**
* 读取多种文件类型
*/
public interface AdvancedFileReader {
//读取text文件
void readTextFile(String filePath);
//读取xlx文件
void readXlsFile(String filePath);
//读取pdf文件
void readPdfFile(String filePath);
}
2.扩展实现接口
代码如下(示例):
/**
* 读取text
*/
public class TextFileReader implements AdvancedFileReader{
@Override
public void readTextFile(String filePath) {
System.out.println("读取text文件:"+filePath);
}
@Override
public void readXlsFile(String filePath) {
}
@Override
public void readPdfFile(String filePath) {
}
}
public class PdfFileReader implements AdvancedFileReader{
@Override
public void readTextFile(String filePath) {
}
@Override
public void readXlsFile(String filePath) {
}
@Override
public void readPdfFile(String filePath) {
System.out.println("读取pdf文件:"+filePath);
}
}
public class XlsFileReader implements AdvancedFileReader{
@Override
public void readTextFile(String filePath) {
}
@Override
public void readXlsFile(String filePath) {
System.out.println("读取xls文件:"+filePath);
}
@Override
public void readPdfFile(String filePath) {
}
}
3.适配器
/**
* 对接多类型文件读取的类
*/
public class FileReaderAdapter implements FilerReader{
AdvancedFileReader advancedFileReader;
/**
* 对应的适配器
* @param fileType
*/
public FileReaderAdapter(String fileType) {
if ("TEXT".equalsIgnoreCase(fileType)){
advancedFileReader = new TextFileReader();
}else if("PDF".equalsIgnoreCase(fileType)){
advancedFileReader = new PdfFileReader();
}else if("XLS".equalsIgnoreCase(fileType)){
advancedFileReader = new XlsFileReader();
}else{
System.out.println("传入的文件类型错误!");
}
}
/**
* 文件读取
* @param fileType
* @param filePath
*/
@Override
public void readFile(String fileType, String filePath) {
if ("TEXT".equalsIgnoreCase(fileType)){
advancedFileReader.readTextFile(filePath);
}else if("PDF".equalsIgnoreCase(fileType)){
advancedFileReader.readPdfFile(filePath);
}else if("XLS".equalsIgnoreCase(fileType)){
advancedFileReader.readXlsFile(filePath);
}
}
}
4 改造原来的接口,加上适配扩展
/**
* 多种类型文件阅读器
*/
public class MultiFileReader implements FilerReader{
FileReaderAdapter fileReaderAdapter;
@Override
public void readFile(String fileType, String filePath) {
//读取txt
if(fileType.equalsIgnoreCase("TEXT")){
System.out.println("读取txt: "+ filePath);
}
//fileReaderAdapter对其他文件格式的支持
else if(fileType.equalsIgnoreCase("PDF")
|| fileType.equalsIgnoreCase("XLS")){
fileReaderAdapter = new FileReaderAdapter(fileType);
fileReaderAdapter.readFile(fileType, filePath);
} else{
System.out.println("文件格式"+ fileType + "读取错误,不支持的格式");
}
}
}
5 测试
public class Client {
public static void main(String[] args) {
MultiFileReader multiFileReader = new MultiFileReader();
multiFileReader.readFile("TEXT","D:/1.txt");
multiFileReader.readFile("PDF","D:/2.PDF");
multiFileReader.readFile("XLS","D:/3.xls");
}
}
总结
适配器在java中应用挺多,连接不同类型数据库jdbc,读取不同类型的文件作为输入或者输出等。一般会结合工厂模式进行使用。