我们这个世界,充满着千奇百怪的对象,更有趣的是对象与对象间是存在着互动,沟通,这样世界才变得美妙。那到底是怎样互动呢?靠什么才能互动呢?是的,接口。比如你和朋友一起喝茶聊天,我们暂且不管声带,耳膜这些功能性对象, 那你们之间聊天的接口就是嘴巴耳朵了,嘴巴发送声波,耳朵接收声波,接口,一定是输入或输出的终端。

好了,这是语言沟通,那如果是行为沟通呢,比如在一个夜黑风高的晚上,你跟你的另一半偷偷钻进了高粱地里并做了一些丧尽天良的事情,到底是通过什么接口互动呢?好吧,这个难题留个你了,好好研究一下留言给我。

好了我们言归正传,如果说你跟毛里求斯人交流,你们之间的接口对接失效了,说什么完全根本听不懂!怎样跨越语言的鸿沟?找个翻译吧,那我们说这个翻译就扮演了一个适配器(Adapter)的角色,其实翻译官们为中日友好做出了巨大贡献,别说是吃你几个烂西瓜。

顾名思义,适配器,得适应当前的不同配置,解决兼容性问题。我们生活中充满了各种各样的适配器,上网用的调制解调器(modem)就是一种数模转换的适配器,俗称“猫”,不过现在都是光猫了,也就是光信号和电信号的互相转化,其实道理是一样的,还有各种变压器也属于电压转换的适配器。

如果觉得还不够形象可以看一下家里的电器,比如你的电视是两项插头,墙上的插孔是三项插孔怎么办?哦,有人说把插头掰弯强行插入!那如果是三项插头接两项插孔呢?把零线插针拔了!呃,我只能说这是暴力破解!违反设计模式原则。言归正传,我们还是不要随便破坏现有的类,那我们需要的是一个转换器,用优雅微妙的方式化解这种不兼容情况。

举个例子,我们开始代码部分,先写墙上的三项插孔接口,命名TriplePin:

public interface TriplePin {//参数分别为火线live,零线null,地线earthpublic void electrify(int l, int n, int e);
}

我们只定义三插孔标准electrify(通电)方法,三个参数分别是火线、零线、地线,很简单吧,同样地接下来是两项插孔接口,只是少了地线,命名DualPin:

public interface DualPin {public void electrify(int l, int n);//这里没有地线
}

请注意,这个并不是我们的墙上的目标接口,而是电视机的两插标准。好了继续,我们的TV登场了,用的是两项插头,当然它实现的是DualPin的标准,Let's keep it simple,命名TV:

public class TV implements DualPin {@Override//既然是两项插头,当然实现两项插标准public void electrify(int l, int n) {System.out.println("火线通电:" + l);System.out.println("零线通电:" + n);}}

那么问题来了,墙上的接口是三插标准,电视实现的是两插标准,无法通电。怎么办?把电视拆了重新修改实现三插标准么?暴力份子你又来?答案显然是否定的,既然是设计模式,果断转换插头啊!好,写个Adapter解决他们之间不可调和的矛盾。

 1 public class Adapter implements TriplePin {23    private DualPin dualPinDevice; 45    //创建适配器地时候,需要把双插设备接入进来6    public Adapter(DualPin dualPinDevice) {7        this.dualPinDevice = dualPinDevice;8    }9
10    //适配器实现的是目标接口
11    @Override
12    public void electrify(int l, int n, int e) {
13        //实际上调用了被适配设备的双插通电,地线e被丢弃了。
14        dualPinDevice.electrify(l, n);
15    }
16
17 }

注意了最关键最精华的部分来了,第3行代码意味着这个适配器内部是有一个双插接口的,对于任何双插标准的设备都是可以兼容的OK吗?不明白赶紧看看你家里的适配器。第6行的代码完成的过程实际就是你把电视插头接入Adapter了,其实适配器并不在意是什么设备,洗衣机冰箱都可以的,只要是双插标准就可以接入(第一节讲过的多态概念)。第12行通电方法实现的是三插标准,但方法体内部第14行实际上是在给“某个设备”(是什么设备就看你接什么了)的双插供电,地线e那个参数是用不上的,所以就没有接通,很清晰透彻吧?

当然,除了以上的注入插头的方式(对象适配),还有另一种更简单的方式叫做“类适配器”我们来看下:

1 public class ClassAdapter extends TV implements TriplePin{
2
3    @Override
4    public void electrify(int l, int n, int e) {
5        super.electrify(l, n);
6    }
7
8 }

看出来区别没有?这里并没有注入插头(对象组合),而是把电视机给继承了,这样就可以直接调用父类(TV)的双插通电而不是注入进来去调用,缺点大家也看到了,这适配器继承为TV儿子专用了,洗衣机是用不了啦,作死?其实也不是完全不好,要看具体应用场景哈。

至此,我们的Adapter就差不多完成了,以后再也不用破坏插头了,因为这样重写接口或者修改类的代价太大,如果其他类还有依赖的话,那统统要修改,引入了没有必要的重构,总之暴力修改是违反设计模式的基本原则的,开闭原则,指的就是对扩展开放,而对修改关闭,也就是说不要去改动原始类,而是扩展现有功能,提供另一种机制让整个系统实现想要的功能。

最后说下那些概念,归类,名字,什么“类适配器”,“对象适配器”啊,其实,理解不了就算了无所谓,真正的意义在于怎么样在实际工作中灵活运用,实现方式是无穷无尽的,道不清说不尽的,没必要太纠结它到底叫什么,归于哪一类,掌控其背后的道才是最根本的,正如李耳君所言:“道可道,非常道。名可名,非常名。”

JAVA设计模式什么鬼(适配器)——作者:凸凹里歐相关推荐

  1. JAVA设计模式什么鬼(备忘录)——作者:凸凹里歐

    备忘录,备份曾经发生过的历史记录,以防忘记,之后便可以轻松回溯过往.想必我们曾经都干过很多蠢事导致糟糕的结果,当后悔莫及的时候已经是覆水难收了,只可惜这世界上没有后悔药,事后我们能做的只能去弥补过失, ...

  2. JAVA设计模式什么鬼(策略)——作者:凸凹里歐

    策略,Strategy,古时也称"计",为了达成某个目标的方案,目标不同,方案也随之更改.例如特工执行任务时总要准备好几套方案以应对突如其来的变化,A计划实施过程中情况突变导致预案 ...

  3. JAVA设计模式什么鬼(状态)——作者:凸凹里歐

    状态State,指某事物所处的状况或形态,比如水的三态,零下会变成固态冰,常温会是液态水,100℃会蒸发成气态的水蒸气. 在这个地球生态系统中,水的总量并不会增加,也不会减少,只是随着温度的变化其分子 ...

  4. JAVA设计模式什么鬼(代理)——作者:凸凹里歐

    代理,代表打理,以他人的名义代表委托人打理其本职工作之外或不所能及的事务,达成合作关系并更高效地促成事务完成的目的.例如明星经纪人,他们并没有像明星一样会唱歌.跳舞或演戏,而是替明星打理一些无暇顾及的 ...

  5. JAVA设计模式什么鬼(初探)——作者:凸凹里歐

    有物混成,先天地生.寂兮寥兮,独立而不改,周行而不殆,可以为天地母.吾不知其名,字之曰道,强为之名曰大.大曰逝,逝曰远,远曰反. 道是什么?道可道,非常道.道不明,说不尽的才算是道,它是自然法则的终极 ...

  6. JAVA设计模式什么鬼(装饰)——作者:凸凹里歐

    装饰,在某物件基础上加以修饰,装点,使得原本的朴素变得华丽,达到化腐朽为神奇的效果.比如我们从开发商买来的毛坯房,必然要进行室内装潢这么一项工程,什么简约风啊,北欧风啊,地中海,美式中式等等,当然萝卜 ...

  7. JAVA设计模式什么鬼(模板方法)——作者:凸凹里歐

    面向对象,是对事物属性与行为的封装,方法,指的就是行为.模板方法,显而易见是说某个方法充当了模板的作用,其充分利用了抽象类虚实结合的特性,虚部抽象预留,实部固定延续,以达到将某种固有行为延续至子类的目 ...

  8. JAVA设计模式什么鬼(门面)——作者:凸凹里歐

    开门见山,门,建筑物的入口,面,脸也.门面(Facade),通常指店铺的门头外表部分,当然一定要临街才是好的商铺,在人流量大的地方营造更好的视觉冲击,这样会有更多等等机会暴露给潜在顾客,否则只能是靠& ...

  9. JAVA设计模式什么鬼(中介)——作者:凸凹里歐

    中介,作用于多个事物之间充当交互沟通的媒介.我们的生活中有各种各样的媒介,比如一些传统媒体,书刊杂志,报纸,把信息传递给读者.再比如利用电子信息技术的互联网,作为一种新媒体,不单可以更高效地把信息传递 ...

最新文章

  1. Ubuntu修改终端@前面的用户名
  2. TX Text Control文字处理教程(13)实现拖放操作
  3. cocos2dx - Lua 语言
  4. python导入openpyxl报错问题,终于解决啦
  5. 蓝桥杯 ALGO-31 算法训练 开心的金明
  6. [蓝桥杯][算法提高VIP]质数的后代-质数筛
  7. 收藏 | 北大华为鹏城联合首次提出视觉 Transformer 后量化算法!
  8. (篇一)作为一个程序猿,这些C语言实例你必须会!
  9. No resource found that matches the given name 'Theme.AppCompat.Light'.
  10. linux ping不允许的操作,Alpine ping:不允许操作
  11. Monent.js:强大的日期处理类库
  12. SCI/SSCI期刊列表已更新,这几本期刊被剔除~
  13. n1_如何高分通过日语N1考试?
  14. 利用metadata-extractor定向获取图片拍摄时间以及宽高
  15. 计算机网络的组成及其逻辑结构
  16. 迭代瀑布不是Scrum
  17. 第九周-求一元二次函数的根
  18. 自动驾驶技术(2)--智能车辆导航技术概述
  19. 计算机基本原理——CPU的工作原理
  20. springboot o.a.tomcat.util.scan.StandardJarScanner : Failed to scan [file:/D:/apache-maven-3.0.5

热门文章

  1. github中的LICENSE是什么
  2. 博途TIA Portal WinCC软件版本和功能区别
  3. 湖南身份证照片可以网上更换啦
  4. GMSSL SM9-加密流程
  5. 计算机专业考编制怎么考,大学这5类专业更适合考编制,有你的专业吗?
  6. 【FER文献阅读】Deep Facial Expression Recognition: A Survey (Shan Li and Weihong Deng)
  7. android pak文件_Android 获取手机中已安装apk文件信息
  8. 记一次与第三方ROM上的360软件全家桶的斗智斗勇难忘的经历
  9. 如何解决磁盘坏道的问题
  10. 解释为什么无限个无穷小的乘积不是无穷小