我们在发现问题到解决问题这个过程中,常会发现很多问题是重复出现的,或是某个问题的变体,外在不同,而本质相同,建筑学上如是,软件行业也是,这些问题的本质就是模式。有人说,设计模式并不是初学者能够理解的,当他们的编程经验到了一定程度,便迫切的需要设计模式来完善自己的代码、优雅自己的设计,以及减少重复编码,这句话也是蛮有道理的,以我的亲身经历来说,当刚开始编程时,拿起那本设计模式的书,郁郁寡欢,将该书搁于书架两年后再次捧起,如遇知音。本文以我在以往项目中遇到的三个编码问题来谈谈学习设计模式的必要性。

1,什么是设计模式:

    一个设计模式提供一种提炼子系统或软件系统中的组件的,或者它们之间的关系的纲要设计。设计模式描述普遍存在的在相互通讯的组件中重复出现的结构,这种结构解决在一定的背景中的具有一般性的设计问题。

2,设计模式的作用:

学习模式最常见的理由是因为我们可以借其:

  ● 复用解决方案——通过复用已经公认的设计,我能够在解决问题时取得先发优势,而且避免重蹈前人覆辙。我可以从学习他人的经验中获益,用不着为那些总是会重复出现的问题再次设计解决方案了。--设计模式给我们提供了解决大多数问题的好方案,利用其他开发人员的经验与智慧。

  ● 确立通用术语——开发中的交流和协作都需要共同的词汇基础和对问题的共识。设计模式在项目的分析和设计阶段提供了共同的基准点。

  ● 有助于提高思考层次——模式还为我们提供了观察问题、设计过程和面向对象的更高层次的视角,这将使我们从“过早处理细节”的桎梏中解放出来。

反面思考:
    对任何设计都可以凭主观(对设计很难做出客观评价)判断得出它是一个好的设计,还是一个坏的设计。使用设计模式是为了避免坏的设计。Martin叔叔在他的著作《敏捷软件开发 原则、模式与实践》中描述了拙劣设计的症状:
    僵化性(Rigidity):设计难以改变。
    脆弱性(Fragility):设计易于遭到破坏。
    牢固性(Immobility):设计难以重用。
    粘滞性(Viscosity):难以做正确的事情。
    不必要的复杂性(Needless Complexity):过分设计。
    不必要的重复(Needless Repetition):过多的重复。
    晦涩性(Opacity):混乱的表达。

3,什么时候使用设计模式

Martin叔叔的书中有段话:  
    在学习它们(设计原则和模式)的时候,请记住,敏捷开发人员不会对一个庞大的预先设计应用那些原则和模式。相反,这些原则和模式被应用在一次次的迭代中,力图使代码以及代码所表达的设计保持干净。
    在这段容易被读者忽略的文字中,我体会到这样几层含义:
    代码是设计;
    设计模式是为了使设计适应变化;
    设计模式是重构的工具;
    设计一开始就要保持干净、简单,以后仍然要保持干净、简单;
    不能过度使用设计模式。
    使用设计模式的目的是为了适应未来的变化,变化之所以存在是因为它的不可预知性——如果可以预知,则不能称其为变化。如何判断哪些需求可能变化,哪些需求可能不变,并且在最大程度上保持设计的干净、简单,这是些工艺问题,而不是工程问题。既然是工艺问题,那么就只能给出原则,不能给出标准。使用设计模式的大体原则可能是:对未来极有可能发生变化的问题给出最简单、修改成本最低的解。

4,设计模式的分类:

    模式依据其目的可分为创建型( Creational)、结构型( Structural)、或行为型( Behavioral )三种。创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述。

(1)Java设计模式之创建模式包括(4个):
Factory--------工厂模式
Singleton------单例模式
Builder--------建造模式
Prototype------原型模式
==================================

(2)Java设计模式之结构模式包括(7个):
Facade---------门面模式
Decorator------装饰模式
Composite------合成模式
Proxy----------代理模式
Adapter--------适配器模式
Bridge---------桥梁模式
Flyweight------共享元类模式

====================================
(3)Java设计模式之行为模式包括(11个):
Chain of responsibleif---责任链模式
Command------------------命令模式
Strategy-----------------策略模式
Observer-----------------观察模式
Interpreter--------------解释器模式
Iterator-----------------迭代模式
Mediator-----------------中介模式
Memento------------------备忘录模式
State--------------------状态模式
Template-----------------模板模式
Visitor------------------访问者模式

5,如何学习设计模式:

    其实设计模式的学习不是你短期看书就能真正会使用的,慢慢在开发中,你遇到了某种模式慢慢自己就积累起来了。

    习设计模式不是一蹴而就的,很多人叹息设计模式似乎很不错,然而在自己的编码设计生涯中用得极少,我想主要原因 是因为对设计模式的学习还不够,还没将其变成属于自己脑袋里的东西,所以当问题变着面孔出现时,认识不到问题的存在,因为不能正确的分析问题、认识问题, 当然也不可能很好的解决问题。
   还未学习过设计模式或对其知之甚少的程序员们,努力学习设计模式吧,那将使你由一个优秀的程序员(Coder)成为一个卓越的软件设计师(Developer)。


设计模式的隐喻:
     武功套路是习武的门径。新手要一招一式地练习套路,烂熟于心之后,熟能生巧,在实战之中即可见招拆招、运用自如——此时习武之人已从“新手”成长为“好手”。“高手”则没有套路,实战之中只有自然反应,然而一招一式浑然天成、恰到好处,似有似无、无中生有。“高手”之上还有“高高手”,他们达到的境界非我等凭借金氏武侠小说可以揣测。
    设计模式之于设计,好比套路之于武术。“新手”要一个接一个地学习模式,“好手”能够活用模式,“高手”则没有模式。
    设计模式的“内功”是面向对象的基本原则。这些原则是“神”,模式是“形”。高手拼的是“内功”,对面向对象基本原则有了深刻的领悟,才能用好设计模式,避免“走火入魔”。
    一般在设计模式著作的前几章都会介绍面向对象的基本原则,这几章非常重要。学通了这几章,后面的模式就不过如此了。学完了设计模式,也最好翻过头来重新看看这几章,保证会有新的领悟。

 

根据网络资料总结。----2011-4-12