Java设计设计模式之适配器模式(Adaptor)
我的博客自从2008年以后就一直没有持续的维护和更新了,自从2014年离职后回了老家,已经两年时间过去了,重新开启了我的职业生涯,那一切都从头开始吧,博客也继续维护起来。废话少说,我们切入正题。
=============================================================
适配器模式的概念:我不喜欢抠字眼,概念的东西总是给人有玩深沉的感觉,就像纯净水恁说他是氢二氧,喝了可以加速新陈代谢的神奇饮品。看了完全让人蒙圈,其实是故意深沉。
先讲个故事吧,张三是卖馍的,李四是卖腊汁肉的,有一天王麻子跑到李四这里来,说李四我要吃你的腊汁肉,但是光吃肉也没意思,你给我整块馍把肉夹里面,于是李四跑到张三那里买了一个馍。王麻子最终拥有了传说中香喷喷的肉夹馍。李四想想这门生意不错,于是他和张三商量,让张三每天给他批发一些馍,然后李四开始经营传说中百吃不厌的肉夹馍。我们抛开花架看骨架,李四为了解决王麻子的需求将自己卖腊汁肉的能力和张三卖馍的能力结合到了一起,我们可以认为李四在这个事情上做了一个适配。我们把这种模式叫做适配模式。通过这种适配,张三依然是个卖馍的,李四依然是专注他如何做腊汁肉,而王麻子呢,却同时享受了馍的酥软与腊汁肉的齿颊留香。
适配器模式分两种:对象适配器和类适配器
首先说说类适配器模式,我们也庸俗一把,先看图,再看代码
张三、李四、王麻子几个人之间关系的UML如下图所示:
代码示例如下:
首先看看王麻子的需求:
/** * */ package adaptorPatternProject; /** * 王麻子作为消费者,既要白吉馍,也要腊汁肉 * * @author Administrator * */ public interface WangMaZi { /** * 有钱就任性,我有钱就有馍 * * @param money * @return */ public Object woYouMo(int money); /** * 有钱就任性,我有钱就有肉 * * @param money * @return */ public Object woYouRou(int money); }
说明:王麻子需要解决的是有肉和有馍的需求。
再看看张三能提供的能力
/** * */ package adaptorPatternProject; /** * 张三的白吉馍店铺 * * @author Administrator * */ public class ZhangSan { /** * 张三说,我有馍 * * @param money * @return */ public Object woYouMo(int money){ //这里处理卖馍的逻辑 return null; } }
王麻子没有找到张三提需求,所以张三一直装作不知道,他只关心他的馍有人买没,他对王麻子没兴趣
李四为了能够满足王麻子的需求,于是启动了适配模式:
/** * */ package adaptorPatternProject; /** * 李四一个卖腊汁肉的,既解决了王麻子的需求,也让张三的工作更有价值,同时没有偏离自己的主业:卖腊汁肉 * * @author Administrator * */ public class LiSi extends ZhangSan implements WangMaZi{ /* * 我是个卖肉的,我的专注力就是腊汁肉 * * @see adaptorPatternProject.WangMaZi#woYouRou(int) */ @Override public Object woYouRou(int money) { // TODO Auto-generated method stub return null; } }
到了这里,就很清楚了,张三还是卖他做的白吉馍,李四还是专注于他的腊汁肉,只是不同的地方在于,通过他把王麻子和张三之间建立了一种特别微妙的关系,这种关系就是,可能张三这一辈子都不会认识王麻子这个人,但是王麻子这个人只要到李四的店里买了肉夹馍,那馍却一定是李四做的。
其次说说对象适配器模式,继续庸俗,还是图和代码
故事还得从李四开始卖肉夹馍说起,话说自从李四开始卖肉夹馍,生意做的那叫一个风生水起,火的不行,慢慢的张三发现了一个问题,自从李四开始从他这里批发白吉馍,来他店里卖馍的人越来越少,而李四每天从他这里批发的白吉馍却越来越多,于是他算了一笔账,与其自己租店面做馍还不如在李四那里用很便宜的价格租一个摊位,反倒会赚的更多,李四心里想,每次批发还得跑来跑去的,还不如李四在我这里卖馍,反正我有的赚还省事儿了。于是对象适配模式就来了。
王麻子的需求没有变化,还是需要馍也需要腊汁肉:
/** * */ package adaptorPatternProject; /** * 王麻子作为消费者,既要白吉馍,也要腊汁肉 * * @author Administrator * */ public interface WangMaZi { /** * 有钱就任性,我有钱就有馍 * * @param money * @return */ public Object woYouMo(int money); /** * 有钱就任性,我有钱就有肉 * * @param money * @return */ public Object woYouRou(int money); }
张三的需求变了,我要在李四这里开摊位,不过我还是卖白吉馍
/** * */ package adaptorPatternProject; /** * 张三的白吉馍店铺 * * @author Administrator * */ public class ZhangSan { /** * 张三说,我有馍 * * @param money * @return */ public Object woYouMo(int money){ //这里处理卖馍的逻辑 return null; } }
李四这次不再进货而是拿张三的馍直接做,每天和李四按卖馍的数量进行分账
/** * */ package adaptorPatternProject; /** * 李四一个卖腊汁肉的,既解决了王麻子的需求,也让张三的工作更有价值,同时没有偏离自己的主业:卖腊汁肉 * * @author Administrator * */ public class LiSi implements WangMaZi{ private ZhangSan zhangSan; /** * @param zhangSan */ public LiSi(ZhangSan zhangSan){ this.zhangSan=zhangSan; } /* * 我是个卖肉的,我的专注力就是腊汁肉 * * @see adaptorPatternProject.WangMaZi#woYouRou(int) */ @Override public Object woYouRou(int money) { // TODO Auto-generated method stub return null; } @Override public Object woYouMo(int money) { // TODO Auto-generated method stub return zhangSan.woYouMo(money); } }
其实你会发现个问题,好多基本的模式好像项目日常中会突发奇想的这么干了,但是当看到别人给你讲这个什么模式云云,你才发现原来自己无师自通。这个没什么好奇怪的,模式之所以称之为模式,是因为大家觉得这么做好像很有道理,然后一帮老外一遍坐一块儿喝着咖啡一遍给这些常用的典型的编程方法想着名字。然后适配器模式就是这么来了。所以所谓的模式其实就是我们工作当中大家这么玩觉得很有道理,一些人为了能够从方法学的角度把这些经验沉淀下来方便后来的人们少走弯路所以才总结出这么一个东西来。
各位看官,原创不易啊,转载请注明出处: http://danlley.iteye.com 看在打字不易的份上,打赏一个吧
上一篇: 适配器模式应用——电源适配器
下一篇: 冬季健脾暖胃 六款药膳让你远离胃寒