Java设计模式-适配器模式(Adapter)


前言

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能,适配器如电脑的电源适配器就是一个例子,能够自动转化适应不通的电源进行充电。


一、适配器模式

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。对于代码的改造尽量复用原来的接口,继承原来的接口实现新的功能。

二、使用步骤

以读取文件为例子,读取不通格式的文件 。
类图如下:
UML图

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,读取不同类型的文件作为输入或者输出等。一般会结合工厂模式进行使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘同学要加油呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值