给设计模式说句公道话

这两天有同学和我聊到了设计模式的问题, 其中一位同学说: 我自学Java ,已经学了封装、继承、多态,也看了设计模式, 但是我发现在编程中根本就用不到啊。


还有一位对设计模式非常不屑: 这是过度设计的代表, 纯属脱裤子放屁,多此一举。

这些对设计模式的看法要么是过激,要么是对设计模式不太了解, 我觉得有必要写个文章,一是给设计模式说句公道话。 二是给大家分享下我学习设计模式的经过。

其实不管你承认不承认, 设计模式已经变成了面向对象编程语言(尤其是Java)的DNA, 一个你绕不过去的门槛。


我可以大胆地预言一下: 只要面向对象的编程范型没有消亡, 只要还在用OO编程,那设计模式就不会过时。

设计模式是什么东西? 简单来讲就是久经考验的、在面向对象设计领域的成功经验的总结。

世界上第一个面向对象的语言Simula在上个世纪70年代就诞生了,70年代产生了更具影响力的SmallTalk,  后来是C ++, Java, C#...... 发展了这么多年, 你可以想象有多少应用被开发出来, 这中间有多少血和泪的教训。

有些人踩了一个坑, 挣扎着爬了上来, 拍怕身上的尘土,挥一挥衣袖, 不带走一片云彩。

有的人则更加有心, 会在那里立上一个牌子: “注意啊,当你看到周边环境出现XXX情况的时候,就说明这里有个坑,可以用XYZ的办法来解决。”

这样的牌子立得越来越多,终于有几个大师跳出来说: 好吧, 是时候对这些牌子做一下分类总结了,我们给这些牌子起个有意义的名称, 这个叫 “工厂方法”, 那个叫“装饰者”......  ,   于是设计模式诞生了。

既然是经验总结,这么好的东西, 为什么初学者感受不到他的好处呢?

我想起来自己刚刚接触设计模式的时候,当时模式的概念进入中国没多久,大家奉若神明,见面不谈模式简直都不好意思和人打招呼。 

 

于是我也赶紧去海淀图书城买一本设计模式的书, 没错,就是“四人帮”写的经典书:

0?wx_fmt=jpeg0?wx_fmt=gif

然后忍受着中文翻译,开始拜读,读完以后的感受是: 嗯,大师的教诲,确实是看不懂啊。

书中举的例子大部分都是很“高冷”的文字编辑器相关的, 和我们这些程序员的日常工作相距较远。由于缺乏切身的体会,这设计模式似乎是隔着一层纱,模模糊糊地能感觉到它的存在, 但是却看不清楚。

有一次吃饭的时候给组长安利设计模式,吹牛说设计模式就是面向接口编程而不是面向实现编程,优先使用组合而不是继承, 发现变化并且封装变化。 -- 其实我当时并没有体会到这种思想,就是记住了而已。 

组长说:这确实是面向对象编程的精髓, 这么好的东西,你可以在项目中用一下啊。


我奉命去项目实战,使出了洪荒之力, 用C++写了一个Iterator出来,高兴得不得了。

组长说: “嗯? 你为什么不用for 循环来遍历? ”

我以为组长不懂:“ 我实现的可是大名鼎鼎的Iterator啊”

“我不管你用什么模式, 但是这就是一个对数组的遍历,在可见的未来,这个数组作为数据结构也不会变化,  为什么再封装一层呢?”

我意识到掉进了另外一个坑里: 为了使用而使用, 完全不考虑Iterator模式要解决的问题 : 提供一种方法访问一个容器对象中各个元素,而又不需暴露该容器的内部细节。

于是我就把设计模式给搁置下来了。

过了一阵子我要写一个在浏览器中运行的Java Applet程序, 需要通过网络访问后台的铁路信息系统,这样的网络访问代码很多,还要处理对象的序列化问题, 这些非业务代码反客为主,把Applet中正常的业务代码搞得凌乱不堪。

当时我就想到,这是位于两个地址空间的程序在通信, 要是那个Applet能像访问本地java方法一样去使用那些接口该多好 !

苦思冥想以后,终于想到了一个设计: 可以做个代理对象,对Applet提供接口, 内部封装网络访问代码和序列化代码, 把请求发送给后台的铁路信息系统系统处理。

0?wx_fmt=png

0?wx_fmt=gif

有了这个代理,把繁琐的、易于变化的细节都封装了起来,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


码农翻身

用故事讲述技术

0.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值