给设计模式说句公道话
还有一位对设计模式非常不屑: 这是过度设计的代表, 纯属脱裤子放屁,多此一举。
这些对设计模式的看法要么是过激,要么是对设计模式不太了解, 我觉得有必要写个文章,一是给设计模式说句公道话。 二是给大家分享下我学习设计模式的经过。
其实不管你承认不承认, 设计模式已经变成了面向对象编程语言(尤其是Java)的DNA, 一个你绕不过去的门槛。
我可以大胆地预言一下: 只要面向对象的编程范型没有消亡, 只要还在用OO编程,那设计模式就不会过时。
设计模式是什么东西? 简单来讲就是久经考验的、在面向对象设计领域的成功经验的总结。
世界上第一个面向对象的语言Simula在上个世纪70年代就诞生了,70年代产生了更具影响力的SmallTalk, 后来是C ++, Java, C#...... 发展了这么多年, 你可以想象有多少应用被开发出来, 这中间有多少血和泪的教训。
有些人踩了一个坑, 挣扎着爬了上来, 拍怕身上的尘土,挥一挥衣袖, 不带走一片云彩。
有的人则更加有心, 会在那里立上一个牌子: “注意啊,当你看到周边环境出现XXX情况的时候,就说明这里有个坑,可以用XYZ的办法来解决。”
这样的牌子立得越来越多,终于有几个大师跳出来说: 好吧, 是时候对这些牌子做一下分类总结了,我们给这些牌子起个有意义的名称, 这个叫 “工厂方法”, 那个叫“装饰者”...... , 于是设计模式诞生了。
既然是经验总结,这么好的东西, 为什么初学者感受不到他的好处呢?
我想起来自己刚刚接触设计模式的时候,当时模式的概念进入中国没多久,大家奉若神明,见面不谈模式简直都不好意思和人打招呼。
于是我也赶紧去海淀图书城买一本设计模式的书, 没错,就是“四人帮”写的经典书:
然后忍受着中文翻译,开始拜读,读完以后的感受是: 嗯,大师的教诲,确实是看不懂啊。
书中举的例子大部分都是很“高冷”的文字编辑器相关的, 和我们这些程序员的日常工作相距较远。由于缺乏切身的体会,这设计模式似乎是隔着一层纱,模模糊糊地能感觉到它的存在, 但是却看不清楚。
有一次吃饭的时候给组长安利设计模式,吹牛说设计模式就是面向接口编程而不是面向实现编程,优先使用组合而不是继承, 发现变化 49 30835 49 15265 0 0 4339 0 0:00:07 0:00:03 0:00:04 4339且封装变化。 -- 其实我当时并没有体会到这种思想,就是记住了而已。
组长说:这确实是面向对象编程的精髓, 这么好的东西,你可以在项目中用一下啊。
我奉命去项目实战,使出了洪荒之力, 用C++写了一个Iterator出来,高兴得不得了。
组长说: “嗯? 你为什么不用for 循环来遍历? ”
我以为组长不懂:“ 我实现的可是大名鼎鼎的Iterator啊”
“我不管你用什么模式, 但是这就是一个对数组的遍历,在可见的未来,这个数组作为数据结构也不会变化, 为什么再封装一层呢?”
我意识到掉进了另外一个坑里: 为了使用而使用, 完全不考虑Iterator模式要解决的问题 : 提供一种方法访问一个容器对象中各个元素,而又不需暴露该容器的内部细节。
于是我就把设计模式给搁置下来了。
过了一阵子我要写一个在浏览器中运行的Java Applet程序, 需要通过网络访问后台的铁路信息系统,这样的网络访问代码很多,还要处理对象的序列化问题, 这些非业务代码反客为主,把Applet中正常的业务代码搞得凌乱不堪。
当时我就想到,这是位于两个地址空间的程序在通信, 要是那个Applet能像访问本地java方法一样去使用那些接口该多好 !
苦思冥想以后,终于想到了一个设计: 可以做个代理对象,对Applet提供接口, 内部封装网络访问代码和序列化代码, 把请求发送给后台的铁路信息系统系统处理。
有了这个代理,把繁琐的、易于变化的细节都封装了起来,Applet中的代码简化了很多, 可以真正地专注业务了。
转念一想,咦, 自己千辛万苦、苦思冥想出的设计方法,不就是设计模式中Proxy模式思想的体现嘛! 原来这才是设计模式啊 !
前辈们早就碰到过坑,已经在这个坑旁边树立了一个牌子:
“远程代理( Remote Proxy )为 一 个 对 象在 不 同 的 地 址 空间 提 供 局 部 代 表。NEXTSTEP[Add94] 使用N X P r o x y类实现了这一目的。Coplien[Cop92] 称这种代理为“大使”(A m b a s s a d o r)。 ”
(微信公众号码农翻身注: 这个NEXTSTEP可是上个世纪80年代,乔布斯被从苹果扫地出门后搞出的操作系统,实在是太古老了,所以不会引起读者的注意。 不过考虑到这本书的是1994年出版的, 也就不足为怪了。)
这个牌子我在看书的时候只是瞥了一眼, 没有深刻体会而已。 我对设计模式感觉模模糊糊的,正说明我在面向对象设计方面是个菜鸟。
多年以后,再回过头去看这个经典书,对于之前根本不在乎的文字却能产生共鸣,充分说明了经验的增长。
后来我就看各种开源的代码实现,陆陆续续接触到模板方法,Command模式,组合模式,工厂方法...... 加深了对设计模式的理解,慢慢的体会到了模式的优雅之处。
对我个人来讲,学习设计模式经历了这么三个阶段:
1. 囫囵吞枣,建立初步印象
2. 在实践中有意或无意的使用设计模式,读开源代码加深体会
3. 忘掉设计模式,把设计模式的思想内化, 变成自己设计方法的一部分。 -- 还在努力修炼中
对于程序员来说,学习设计模式,最重要的是学习它背后的思想,努力地体会设计模式是怎么在一个场景下去解决问题的。
刚开始搞不明白也没什么大不了的,学习本来就是螺旋上升的过程,努力地思考,总有顿悟的一天。
最后再重复一遍模式背后的思想吧:
面向接口编程而不是面向实现编程
优先使用组合而不是继承
发现变化并且封装变化
你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身2016文章精华》或者《码农翻身2017上半年文章精华》
有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan QQ: 3340792577
码农翻身
用故事讲述技术