「这是我参与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");
}
可以看到,我们使用文档工具,适配器自动帮我们匹配到了相应的具体文档工具。
三、总结
优点:不用修改现存的代码,符合开闭原则,实现了解耦。
缺点:代码变得稍显混乱,调用一个接口发现使用的是另一个接口,使得代码结构不那么清晰。