一起谈谈设计模式(一):适配器模式


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源码实现分析

3. 源代码

Github:https://github.com/itcrud/design-pattern


文章作者: 程序猿洞晓
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 程序猿洞晓 !
评论
 上一篇
ORM框架之Mybatis(八):mybatis基础代码的了解和源码跟踪 ORM框架之Mybatis(八):mybatis基础代码的了解和源码跟踪
mybatis使用在日常开发中很简单,基本没有门槛,都是和Spring直接集成,然后把之前的一些配置copy到spring的配置文件中就可以使用。具体mybatis的配置文件加载代码,已经SqlSession执行的细节都被封装到了框架中,符合面向对象编程,但是存在一个问题就是那些细节的代码慢慢都被遗忘。写这个博客就是记录……
2018-09-19
下一篇 
ORM框架之Mybatis(七):configuration配置源码除探 ORM框架之Mybatis(七):configuration配置源码除探
建造者模式是Java基本设计模式的一种,是经常被使用到的。比如在开发过程中经常使用的lambok插件,在实体类上加上@Builder就可以使用建造者模式方式构建实体对象。这mybatis中同样也使用到了这种设计模式,但是不是使用的lambok插件。在读取配置文件的时候,需要读取各种类型的标签,让构造器和标签对应,可以将标签的……
2018-09-15
  目录