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

概念

适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得之前由于接口不兼容不能一起工作的那些类可以一起工作。

解释:干货的概念很难理解,那就举个栗子吧。

现在小明需要到世界各国去访问,但是现在有一个问题需要解决,小明只会中文,英语、法语啥的都不懂,这个时候就需要请翻译官,每个翻译官对应一种语言。然后小明用中文告诉翻译官所要说的内容,翻译官将中文转换成对应的另一方语言,告诉接待小明的异国朋友。这样就相当于一个适配器模式,客户小明不管站在对面的是什么人,说的什么语言,我只要有翻译官,就一切搞定。

看图:

在这里插入图片描述

图中的Client就相当于是小明,Server是翻译公司,ServerAdapter就是翻译官,ThirdServer就是会见的各个国家朋友。

Demo Code

上面说了概念和流程图,基本的设计思路都清楚了,现在需要看怎么去实现。

客户端类
//客户端类
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;
    }
}
翻译公司和翻译人员
//翻译公司
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!");
    }
}
对应国家的朋友
//英国朋友
public class EnglishFriend {

    //听的功能,并且只接受英文内容
    public void doListen(String content) {
        System.out.println("做了一个哭的动作");
    }
}
//发过朋友
public class FrenchFriend {

    //听的功能,并且只接法语内容
    public void doListen(String content) {
        System.out.println("做了一个笑的动作");
    }
}
测试过程
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源码实现分析

reference

大话设计模式 程杰 著

Code

码云(gitee):https://gitee.com/itcrud/design-pattern

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序猿洞晓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值