对23种设计模式的初步理解
创建型模式
故事一:取单车
1.我可以通过摩拜单车工厂的Mobike(方法)和MobikeLite方式可以拿到不同类型的单车。-工厂方法模式
2.帮人借车,同事给我发短信叫我帮他去先抢一辆单车,我根据他发的短信内容:“Mobike”(或者“MobikeLite”),从而知道具体要给他从摩拜单车工厂抢哪一种类型的车。-简单工厂模式
3.据我所知,成都有一个共享单车工厂(抽象工厂),专门负责提供共享单车。单车工厂里有摩拜单车工厂、一步单车工厂、ofo单车工厂、永安单车工厂等,而就摩拜单车工厂而言,就有Mobike、MobikeLite两种不同方式获取不同类型的单车,其他工厂可能也有一种或多种方式获取各自工厂不同类型的单车。-抽象工厂模式
故事二:一辆单车用遍天
1.椿哥(主角)感觉共享单车销路好,于是自己开了一个单车旗舰店:椿哥号单车(类)。但是由于成本有限,只定做了一辆椿哥号单车(实例)。一个人扫码用完之后,其他人才可以继续扫码使用。-饿汉式单例模式
2.椿哥发现生意不是很好,打算换个思路。这次不先定做单车了,而是当有人需要用车时,我才生产一辆单车(当然同样是用完其他人才能继续使用)。-懒汉式单例模式
故事三:造个亲兄弟
1.在使用摩拜单车的时候,我发现某辆单车操控性、强度都灰常棒,于是找生产商给我独家定制一辆一模一样的单车,必须是所有性能指标都相同。-克隆模式
故事四:多样化定制
1.公司一群同事要去西岭雪山耍,我提前通知了摩拜单车生产商,让他们给我生产12辆后碟刹好、安全性强的MobikeLite单车。-建造者模式
构造型模式
故事一:增强单车
1.后来椿哥开始转行卖单车。由于发现购入的单车*小,骑不快,于是椿哥把从狗剩那儿买来的单车(实例)换成了大*,并为单车添加了一个尾灯。现在其他人都在椿哥这儿买单车,而不在狗剩那儿买了。-装饰模式
故事二:控制单车
1.椿哥又觉得椿哥号单车上的尾灯亮着太刺眼了,容易造成安全事故。于是让所有生产的单车都把尾灯遮起来(对用户隐藏),并卖给了用户。-代理模式
故事三:为用户适配单车
1.用户反馈单车坐垫太硬,屁股受不了。一看发现自己生产的椿哥号单车的坐垫没有某种类型的弹簧,而狗剩牌单车有。问他要,他却不给,他说除非让他的品牌冠名。于是乎,我的单车叫做:继承自狗剩牌的椿哥号单车,从而我的单车坐垫有了这种弹簧功能,用户也很满意。-类的适配器模式
2.椿哥发现,冠名了(实现)狗剩牌单车需要把狗剩牌公司所有的单车生产规定(接口方法)都定制在自己生产的单车上面,这是不能容忍的。于是,椿哥开了一个外壳公司(抽象类),让这个公司生产单车的规定都符合狗剩牌单车生产规定,但是就是不生产单车。另一方面,椿哥实际的这个公司让这个外壳公司冠名(继承于)。这样,实际公司生产单车的规定只需要符合外壳公司生产单车的规定就行,不符合都没关系(毕竟都是自己公司嘛,自己说了算)。-接口的适配器模式
3.经过上面的偷梁换柱,椿哥还是越想越窝囊。于是椿哥把狗剩家的单车(实例)偷了过来,把单车上的那个功能性弹簧安到了自己生产的单车上。于是,椿哥的单车同样叫椿哥号单车,单车的坐垫也同样具备了这种弹簧功能,用户同样也灰常满意。-对象的适配器模式
故事四:多样化的需求
1.椿哥公司有两种品牌的单车:Mobike、MobikeLite(抄袭摩拜的)。而有些用户需要Mobike小*,于是生产Mobike小*单车;有些用户需要Mobike大*,于是生产Mobike大*单车;还有些需要MobikeLite小*或者大*,也就得生产相应小*、大*的MobikeLite,这很麻烦!于是椿哥采取这种方式:只生产两种类型的单车Mobike、MobikeLite(均无*),再生产两种类型的*:小*、大*,最后改造单车使单车换*变得方便。于是用户需要小*MobikeLite,就把小*安到MobikeLite上面;需要Mobike大*,就把大*安到Mobike上面……。-桥接模式
故事五:一体化
1.椿哥单车的尾灯在刹车时需要手动控制才能亮,刹车也需要手动控制。于是椿哥做了一个刹车器:一紧握刹车器,刹车能够进行刹车,尾灯也可以发光;一松开刹车器,刹车立马结束,尾灯也停止发光。-外观模式
故事六:集中化管理
1.现在椿哥也玩共享单车了,但是谨慎的他觉得,单车放到路边到处都是,一点也不安全,万一丢了呢?于是他把他的共享单车全部放到指定地点,专人看管。需要用车时,管理人员给你推出来,还车时又放回去。-享元模式(参见数据库连接池的实现)
故事七:单车编号回收
1.现在的用户太难伺候了,用户们把用完的单车随处一放就完事,根本不按照规定放回椿哥指定的地点。因此每到了晚上,椿哥还得一辆一辆地按照单车编号进行回收。鉴于此,椿哥提出了一个叫做单车体的概念。单车体里面包含一辆单车,一个存储器。存储器里面分别存储上一编号单车所处位置(对象引用)和下一编号单车所处位置(对象引用)。这样,找到单车时就可以根据单车体中的存储器找到上一编号的单车和下一编号的单车了。-组合模式(参见二叉树、链表的实现)
行为型模式
故事一:动态定制轮胎
1.椿哥号单车的轮胎是直接购入的其他厂商生产的高性能轮胎。有李铁蛋厂商的越野车用轮胎(算法),也有王大炮厂商的休闲车用轮胎(算法)。客户有哪种需求(爬坡?休闲?),椿哥的生产部门(环境)就用相应厂商提供的轮胎(算法)给客户生产相应功能的单车。-策略模式
故事二:品牌化的椿哥号单车
1.椿哥号单车已成为一个品牌,其他厂商都想冠名(继承)椿哥号单车,但是各个厂商都有不同的单车生产风格:有山地型的,有街型的,还有杂技车。于是椿哥把椿哥号单车一部分功能(公有的部分)自己实现了,其他有分歧的标记了一个空位,如轮胎空位、刹车空位。其他厂商继承椿哥号单车后,以自己的方式实现了这些个空位,问题解决了。-模板方法模式
故事三:偏题的单车研究
1.椿哥最近在研究一款新型单车,它有一个尾灯,并且这个尾灯的实现原理灰常有意思:一个发光系统,里面含有一个灯和一个指示器,灯完全按照指示器工作。即指示器标记红时发红光,标记绿时发绿光;一个控制器,内含一个指示选择按钮(直接与发光系统的指示器相连),一个发光按钮(与发光系统的灯相连)。它是这样工作的:指示选择按钮选择红,此时发光系统的指示器马上标记为红,点击控制器的发光按钮,发光系统的灯开始运作,判断指示器的标识,发现为红色,于是发红光。-状态模式
故事四: 车速备份
1.为了给单车制造黑匣子,椿哥尝试将单车车速进行一个手动备份:单车(类)有一个车速指标(属性),同时备份文件也有一个车速变量(用于记录单车的车速)。用户手动按下单车上的备份按钮,单车内置的备份程序(方法)将车速复制到备份文件的车速变量上面。而这个备份文件怎么保存呢,那就放进一个存储器里吧(支持备份文件的读出和写入)!-备份模式
故事五:尾灯的思考
1.椿哥认为,单车尾灯和控制按钮联系太紧密了,通过一条线来控制,如果线断了或者接触不良怎么办?于是他打算借用无线远程中转点(只用于该发光信号转发)来进行改进:按下按钮,发送“我需要发光”内容的无线信号到远程中转点,远程中转点同样发送“我需要发光”内容的无线信号到尾灯,尾灯接受信号后发光。-命令模式
故事六:椿哥号单车公司公款报销问题
1.椿哥号单车公司的项目经理只有报销500元的权利,超过了,他会把报销任务交给部门经理;部门经理只有报销1000元的权利,超过了,他也会把报销任务交给总经理;总经理只有报销2000元的权利……-责任链模式
故事七:检查回收的共享单车
1.椿哥的共享单车每晚都要进行回收(大家众所周知的)。一般回收都是用大卡车拉回来(一辆大卡车里有很多辆单车)。拉回来之后还要进行质检,查看是否有单车被损毁。于是,椿哥做了一个系统,让单车在大卡车里就通过遍历而进行单辆地质检:首先为所有的大卡车配备一套集合遍历系统,通过点击大卡车的“录入单车到遍历集合”按钮就可以将大卡车中所有单车信息录入到集合遍历系统中。而集合遍历系统,椿哥也为其写好了集合遍历功能。于是调用之,得到每辆单车信息,然后分析其各项指标是否通过质检。这样就完成了这个事情。-迭代子模式(参见迭代器的实现)
故事八: 刹车的通知
1.椿哥的单车突然需要这样一个功能了,即单车的刹车系统功能的损毁需要通知给其他系统,如尾灯系统、备份系统。那么如何通知到其他系统上面去呢?椿哥是这样做的:将其他功能系统都通过一根线(引用)聚集到刹车系统的一个集中存放点中。需要通知时,拿出每条线的接头,向里面传送相应信号就可以通知到各个系统中去了。-观察者模式
故事九:相互联系的解耦问题
1.单车的车速计算系统和备份系统是相互关联的,即车速计算系统在运作了,而备份系统必须要运行着;备份系统运作着,车速计算系统也必须在运行。椿哥觉得如果直接进行联系,两个系统就太紧密了,不符合他程序员的编码风格。于是,决定解耦:使用了一个公用系统,它同时具有开启两个系统的功能。备份系统启用后,马上命令公用系统开启车速计算系统,车速计算系统也就运行了;而车速计算系统启用后,也会立即命令公用系统开启备份系统,备份系统也就运行了。-中介者模式
故事十:访问车速数据
1.椿哥想插脚大数据领域:想通过分析众多用户使用单车的车速情况来得到一些宝贵的大数据资源。需求是这样的:远程的在线分析系统要去访问单车的车速备份系统,以拿到车速数据。实现是这样的:在线分析系统先申明,我只能访问单车的车速备份系统(不能什么系统都访问,不然对用户太危险了),读取备份功能可以将备份系统的车速数据读取到。而车速备份系统同样严厉声明,我可以开放访问接口,但是只允许在线分析系统访问(不然我也太危险了)。同时车速备份系统提供被读取功能,功能会调用在线分析系统的读取备份功能以访问自己的车速数据。-访问者模式
故事十一:椿哥的自白
1.椿哥:解释器模式参见正则表达式的实现。
最后椿哥通过研究单车走上了人生顶峰……