关于设计模式的理解
# 关于设计模式的理解
# 设计模式玄,也不玄
对于10万行以下的代码量的程序员来说,设计模式=玄学;
对于10~50万行代码量的程序员来说,设计模式=科学;
对于50万行以上代码量的程序员来说,设计模式=文学。
设计模式它玄,也不玄!设计模式就如兵家中的《孙子兵法》。《孙子兵法》玄不玄?玄!因为在芸芸众生中能看懂、悟透的人很少,能真正灵活应用的人更少!而且战争的成败受众多因素的影响,如天时、地利、人和。但你要问中国历代名将中有哪个不读《孙子兵法》的?几乎没有,如三国的曹操、南宋的岳飞、明代的戚继光,这些人可谓把兵法用得出神入化了。两千多年来世界上其他没看过《孙子兵法》的国家是怎么打仗的?照样打。没学过兵法的人就不会使用里面的谋略吗?当然会用,而且经常用。比如“借刀杀人”、“打草惊蛇”等等计策。这样的例子还有很多,只是很多人都不知道在古代就已经有人把这些计策总结成“战争谋略”了。所以说《孙子兵法》其实也不玄。
同样的道理,“设计模式”是一套被有经验的面向对象的软件开发人员反复使用的、被无数工程师实践的代码设计经验的总结,它代表了最佳的实践。因为它比较抽象,没有一定的编程经验很难读懂,更不能理解其精髓,所以很多人觉得它玄。但真正的架构师和优秀的程序员几乎没有不看设计模式的,因为在软件开发过程中,它能给软件开发人员面临的一般问题提供解决方案。而能把设计模式应用得炉火纯青的,那就是大神。同样的问题:没有学过设计模式就不会使用设计模式了吗?当然不是!只要你有两年以上的编程经验,像模板模式、单例模式、适配(Wrapper)模式,这些你肯定用过,只是你不知道有前人经过相当长的一段时间的试验和错误将其总结成书了。所以说设计模式其实也不玄!
# 如何区分不同的模式
设计模式之间的区分,更多的要从它们的含义和应用场景来区分,而不应该从它们的类图结构来区分。策略模式、状态模式、桥接模式这三种模式的类图几乎是完全一样的。从面向对象的继承、多态、封装的角度来分析,它们是完全一样的。但它们的实际应用场景不同,侧重点不同。策略模式侧重的是算法的变更导致执行结果的差异,状态模式侧重的是对象本身状态的改变导致行为的变化,而桥模式接强调的是实现与抽象的分离。
# 编程思想的三重境界
你可能经常听到一些程序员说:设计模式这东西很虚!设计模式确实虚!因为它看不见摸不着,它是面向对象思想的高度提炼和模板化。既然是思想,能不虚吗?它就像道家里面的“道”的理念,每个人对“道”的理解是不一样的,对“道”的认知也有不同的境界,而不同的境界对应着不同的修为。宋代禅宗大师青原行思提出参禅的三重境界:
参禅之初,看山是山,看水是水;禅有悟时,看山不是山,看水不是水;禅中彻悟,看山仍是山,看水仍是水。
上面讲述的是对禅道的认识的三重不同境界。设计模式既然是一种编程思想,那也会有不同的境界,这里也将它概括为三重境界:
- 一重境界:依葫芦画瓢。这属于初学阶段,以为设计模式只有书中提到的那几种,能把模式名称倒背如流,但真正要用时,还得去翻书,依据类图照搬照改。
- 二重境界:灵活运用。这属于中级阶段,即对每一种设计模式都非常熟悉,有较深入的思考,而且能够根据实际的业务场景选择合适的模式,并对相应的模式进行恰当的修改以符合实际需求。
- 三重境界:心中无模式。这是最终阶段,这里说无模式并非不使用设计模式,而是设计模式的理念已经融入使用者的灵魂和血液,已经不在乎具体使用哪种通用模式了,但写出的每一处代码都遵循了设计的原则,能灵活地创造和使用新的模式(可能这种模式使用者自己也不知道该叫什么)。这就是所谓的心中无模式却处处有模式。
其实这种道家思想不仅仅可以应用在编程思想上,也可以体现在我们程序员这个职业上,这里不展开描述,有兴趣可以看看程序员的玄学与佛学。
摘自: 罗伟富. 《人人都懂设计模式:从生活中领悟设计模式:Python实现》. 电子工业出版社