适配器模式浅谈

98 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

一、什么是适配器模式

很经典的一个栗子:我门的手机充电器的插头是两个孔的,但如果墙上的插头是三个孔的,是不是感觉裂开了,充不了电。这个时候我们可以使用适配器,适配器插入的那边是三个孔,另一边是两个孔(我们的插板应该也算是一种适配器),这个时候我们手机就可以充电了。还有一个栗子:据说漂亮国的民用电压110V,我们国家的电压220V,比如我们的电风扇或者笔记本(带过去的)需要的是220V电压,估计插上去应该是没得反应,这时候咋办呢,使用升压器,转成220V后即可使用。在上述的栗子中,我们没说要去重新买个充电器(充电器估计可以买),电风扇和笔记本总不能买个新的把,而是通过适配器,使得原来不符合的,无法使用的,变得可以使用,适配器就是起一个转换或者中转的作用。

二、适配器模式的实现

public interface DocumentManager {
    void open(String fileType, String fileName);
}

抽象文档管理工具,可以打开文档

public interface PdfAndWordManager {
    void openPdf(String fileName);

    void openWord(String fileName);
}

pdf或者word文档管理工具,可以打开pdf或者word

public class WordDocument implements PdfAndWordManager {
    @Override
    public void openPdf(String fileName) {
        //word无法打开pdf
    }

    @Override
    public void openWord(String fileName) {
        System.out.println("open word:" + fileName);
    }
}

文档管理工具word,可以打开word

public class WpsDocument implements PdfAndWordManager {
    @Override
    public void openPdf(String fileName) {
        System.out.println("open pdf:" + fileName);
    }

    @Override
    public void openWord(String fileName) {
        //假设wps无法打开word
    }
}

文档管理工具wps,可以打开wps

public class DocumentAdapter implements DocumentManager {
    PdfAndWordManager pdfAndWordManager;

    public DocumentAdapter(String fileType) {
        if (fileType.equals("pdf")) {
            pdfAndWordManager = new WpsDocument();
        } else if (fileType.equals("word")) {
            pdfAndWordManager = new WordDocument();
        }
    }

    @Override
    public void open(String fileType, String fileName) {
        if (fileType.equals("pdf")) {
            pdfAndWordManager.openPdf(fileName);
        } else if (fileType.equals("word")) {
            pdfAndWordManager.openWord(fileName);
        }
    }
}

文档工具适配器,通过文档类型,选择使用的具体文档工具

public class DocumentOpen implements DocumentManager {
    DocumentAdapter documentAdapter;

    @Override
    public void open(String fileType, String fileName) {
        DocumentAdapter documentAdapter = new DocumentAdapter(fileType);
        documentAdapter.open(fileType, fileName);
    }
}

具体要使用的文档工具,类似于我们在电脑上打开文档时,让我们选择用啥软件

public static void main(String[] args) {
    DocumentOpen documentOpen = new DocumentOpen();
    documentOpen.open("pdf","1223");
    documentOpen.open("word","1223");
}

可以看到,我们使用文档工具,适配器自动帮我们匹配到了相应的具体文档工具。

image.png

三、总结

优点:不用修改现存的代码,符合开闭原则,实现了解耦。

缺点:代码变得稍显混乱,调用一个接口发现使用的是另一个接口,使得代码结构不那么清晰。