设计模式与武侠

关键字: 代码分享 设计模式

本学期学完设计模式,略有感悟,和大家共勉。首先看一下模式的定义:

模式:在某情境下,针对某问题的某种解决方案。

  • 情境:应用某个模式的情况。这应该是不断重复出现的情况。
  • 问题:你想在某情境下达到的目标,但也可以是某情境下的约束。
  • 解决方案:这是我们的目标。一个通用的设计,用来解决约束,达到目标。

通俗版本:如果你发现自己处于某个情境下,面对着所欲达到的目标被一群约束影响着的问题,然而,你能够应用某个设计,克服这些约束并达到该目标,将你领向某个解决方案。

在我看来,“模式”就像武侠小说里大侠们使的武功招式(一个模式对应一种武功招式):

  1. 就是因为有了武功招式,才让专业习武者和市井流氓打架时的拳打脚踢区分开来;

    同理,设计模式等专业术语也让专业软件设计师和业余编程爱好者有了本质区别。

  2. 武功招式普遍都有一些很响亮的名字,比如太极里的“白鹤亮翅”;

    同样,每个设计模式都有一个形象贴切的名字,像“观察者模式”。

  3. 武功招式,都是由最基本的拳、掌、钩等(或者剑术的刺、劈等)基本招式组成,并以各门各派的“内功心法”为指导,形成能够强身健体、修身养性的招数;

    设计模式,同样是由最基本的基础元素:抽象、封装、多台、继承组成,并合理遵循贯彻Object-Oriented设计原则,产生富有弹性的类图结构和设计框架。

  4. 武功招式会被滥用,初学者做起事情来,处处都是有头有脸的招式,在木板上订枚钉子,好好的榔头不用,非要用什么一阳指、千斤坠;

    设计模式同样会有如此尴尬,初学者“为了用设计模式而用设计模式”,甚至扬言写个Hello World也要用设计模式,这时候就病入膏肓了。

  5. 《笑傲江湖》中,风清扬教令狐冲“独孤九剑”的时候,倾囊相授之后要他尽数忘记。以后在比剑的过程中随心所欲,想起那一招就使出哪一招。 悟道(编程之道)者的心智能够看到模式在何处能够自然融入,不必去思考这个地方用“策略模式”好还是用“模板方法模式”好,一切顺其自然。

  6. 武学的一种高境界,是无招胜有招,因为但凡是招式,就有其弱点,能被相克的招式破解,而且并不是人人都能练好这一招一式;

    编程亦是如此,每个模式虽然威力强劲,但都是比较复杂的实现方式,而且各自都有相对的适用范围和使用后果(好的或坏的)。

  7. 学习武功招式,最美妙的地方就是能和其他习武者一起切磋改进,还能相互学习;

    设计模式的绝顶妙处也是让你和其他设计者有共同语言,并且不用重复制造车轮。

  8. 武学宗师能够自创武功;

    设计大师同样挖掘模式。

  9. 武功有欣赏价值;

    设计有艺术气息。

总结起来,无论是习武也好,编程也好,简单才是硬道理,最完美的解决方案属于最简单的方案,而不是最绚丽的方案。

要达到无招的境界,时刻把《汝当分离软件与信仰》铭记在心。

但所谓的无招也只是冰山的一角,神雕第二十六回,杨过发现独孤求败的剑冢,里面埋藏着三把剑及四片刻有文字的石片,代表着这一代高手的四个阶段。这学剑的四个阶段,其实也可以用于学习处事的四个不同阶段。

第一柄剑长四尺,锋利无比,剑下石片下写着,刚猛凌烈,无坚不摧,弱冠前与河朔群雄争锋。少年人性格刚烈,对世界诸多不满,急于清除一切不公平、不完美的实物,满怀理想到处攻击批评,锐不可当,自觉无坚不摧,与河朔群雄争锋云云更是为之使命的事。

后来就发觉问题了。第二片石片上没有剑,下面写着,紫薇软剑,二十岁前用,误伤义士不详,乃弃之深谷。软剑比平常硬剑难使,比之锐不可当又上一层,但是一味自以为伸张正义,殊不知自己也会有错,以致误伤义士。到这时才明白但凭一时冲动的判断是多么不可靠。所谓不祥,是心生内疚,弃于深谷的不单是误伤义士的软剑,还有少年人不顾一切、不可一世的锐气。

第三把剑顺理成章的事凝重的钝剑。石片下写的是重剑无锋,大巧不工,四十岁之前持之横行天下。老练世故的人,早已学会怎样举重若轻、不露锋芒、反而威力更大。大巧不工这四字知易行难,最重要的是锻炼内力深厚。不过,钝口无知的重剑与利剑、软剑的分别,归根究底仍是技巧上的分别 ,目标始终是霸道,持之横行天下。

第四个阶段才是渐入化境,第四柄木剑,石片上文字道,四十岁之后不屑带物,草木竹石均可为剑。自此精进,渐入无剑胜有剑之境。

不屑带物,也就是不被外物所控制了,无剑胜有剑,因为无剑束缚更少、限制更少,木剑不过是聊备一棺。到了四十岁便有这样的进展,不为身外物、不为名利成败所劳役,渐趋淡薄,的确令人羡慕。然而,到了这个境界,人就难免寂寞了,独孤求败连一败也求不到,岂非做尘俗中人更好。

zzp-me更新链接地址
zzp-me设计模式与武侠