1. 设计模式是中级程序员向高级程序员过渡的关键,跨不过这道坎,无论有多少经验,你都不会真正体会到编程之美。
那么什么是设计模式?简单的说就是套路,招数,和搏击中的套路和招数是一个意思。
我们学习一门语言(例如java),基本语法类似于搏击中的基本功(类似直拳、勾拳、侧踢),而设计模式则类似于组合技。
搏击中的组合技适合不同的场景,例如倒地的时候,如果对手的关节处于合适的位置,专业的格斗家会选择一个“十字绞”来完成一次绝杀。
这个“十字绞”在搏击中被称为套路,如果用科学的语言说,这就是一个模式,可被称为“搏击模式”。
而所谓的“搏击模式”就是无数的搏击家,在搏击实践中,总结出的,应对特殊场景下“最佳”搏击实践。
类似的,中国象棋中也有很多模式,例如“马后炮”、“连环马”等。
而《孙子兵法》、《三十六计》就讲解“战争模式”的书。
而设计模式,直白的说就是编程中的模式,它是过去的优秀程序员总结出的,面对特定编程问题的特殊“招式”,最佳实践。
在搏击学习中,教练如何向运动员传授招式(模式)呢?有3个关键点:
- 招式的名字
- 步骤
- 触发的场景
三者缺一不可。
一个言简意赅的名字必不可少,它是搏击沟通的语言,不仅在运动员和教练之间,同时也在体育解说和观众之间。例如,当运动员在场内比赛的时候,条件合适,教练只需要再外边喊一句“十字绞”,运动员马上就知道该怎么做。
编程也如此,我们也必须给常见的编程招式起一个响亮的名字,例如“观察者模式”,“单例模式”等等。这样,在程序员之间沟通的时候,对一个具体的问题,你就可以说:我认为这里应该使用“单例模式”,对方马上就明白你想表达的意思。
而设计模式的步骤也和搏击招式一样,例如“十字绞”要先扣住对方的手,然后方向扳动对方的关节…编程中的“观察者”模式也要先设计观察者接口,然后再提供注册方法…
模式的触发条件,搏击和编程也类似,“十字绞”触发的条件是在地面战中,对方的手被控制住,且无法挣脱…,而“观察者模式”触发的条件包括“我知道你,但你不需知道我”,“不要来找我,我会去找你”…
既然格斗的招式和编程的设计模式如此类似,同样,学习方法也是高度类似,那就是:先记住(背会)招式,然后大胆去使用,在实战中找感觉,渐入化境。除此之外,再无他法。
其中,最难的不是具体模式的步骤,而是触发条件。新人最大的问题不是不会实现设计模式,恰恰相反,而是“滥用”设计模式,也就是所谓的“过度设计”。
但没有办法,学习设计模式这是必经的过程:“从少到多,再从多到少”。这个过程是玄妙的,也是朴实的,也是编程最有魅力,最能体现编程哲学的地方。
学习设计模式很像王国维讨论治学时的三重境界:
-
第一重境界:独上高楼,望尽天涯路。
-
第二重境界:为伊消得人憔悴,衣带渐宽终不悔。
-
第三重境界:众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。