1. 概念
适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得之前由于接口不兼容不能一起工作的那些类可以一起工作。
解释:干货的概念很难理解,那就举个栗子吧。
现在小明需要到世界各国去访问,但是现在有一个问题需要解决,小明只会中文,英语、法语啥的都不懂,这个时候就需要请翻译官,每个翻译官对应一种语言。然后小明用中文告诉翻译官所要说的内容,翻译官将中文转换成对应的另一方语言,告诉接待小明的异国朋友。这样就相当于一个适配器模式,客户小明不管站在对面的是什么人,说的什么语言,我只要有翻译官,就一切搞定。
看图:
图中的Client就相当于是小明,Server是翻译公司,ServerAdapter就是翻译官,ThirdServer就是会见的各个国家朋友。
2. 示例代码
上面说了概念和流程图,基本的设计思路都清楚了,现在需要看怎么去实现。
2.1 客户端类
//客户端类
public class Client {
//小明将要说的话告诉翻译官
public void doSay(Integer mark, String content) {
Translator translator = null;
if (isEnglish(mark)) {
translator = new EnglishTranslator();
} else if (isFrench(mark)) {
translator = new FrenchTranslator();
}
if (translator != null) translator.translate(content);
}
private boolean isEnglish(Integer mark) {
return (mark & 1) == 1;
}
private boolean isFrench(Integer mark) {
return (mark & 1) == 0;
}
}
2.2 翻译公司和翻译人员
//翻译公司
public interface Translator{
//接收中文内容接口
void translate(String content);
}
//翻译人员(英语)
public class EnglishTranslator implements Translator{
private EnglishFriend friend = new EnglishFriend();
//将中文转换成英语,告诉英国朋友
public void translate(String content){
friend.doListen("HMake a cry!");
}
}
//翻译人员
public class FrenchTranslator implements Translator{
private FrenchFriend friend = new FrenchFriend();
//将中文内容翻译成法语,告诉巴黎朋友
public void translate(String content) {
friend.doListen("Fais un sourire de mouvements!");
}
}
2.3 对应国家的朋友
//英国朋友
public class EnglishFriend {
//听的功能,并且只接受英文内容
public void doListen(String content) {
System.out.println("做了一个哭的动作");
}
}
//发过朋友
public class FrenchFriend {
//听的功能,并且只接法语内容
public void doListen(String content) {
System.out.println("做了一个笑的动作");
}
}
2.4 测试过程
public class MainTest {
public static void main(String[] args) {
Client client = new Client();
//听英语翻译
client.doSay(1, "给朕哭一个!");
//听法语翻译
client.doSay(2, "给朕笑一个!");
}
}
启动main
方法后,直接的结果是法国朋友的doListen
输出一个笑的动作,英国朋友输出一个哭的动作。如果现在还有其他国家的朋友,小明所说的话完全不用变,只要将内容告诉翻译人员,异国朋友就能做出相应的动作。
上面映射到实际开发环境中,业务如小明,调用的接口方法完全不用变,即使对接的第三方组件有变化,他也完全不用理会,调用接口后,由适配器完成就好。
再看看想想之前写的mybatis日志模块设计,就是巧妙的使用了适配器模式,让mybatis业务代码完全不变的去适配各种不同的日志组件,不失为一种最佳实践参考模板。ORM框架之Mybatis:logging源码实现分析