设计模式描述的是软件设计,因此它是独立于编程语言的,但是最终实现仍然要使用编程语言来表达。设计模式不像算法技巧,可以照搬照用,它是建立在对“面向对象”纯熟、深入理解的基础上的经验性认识,掌握面向对象设计模式的前提是首先掌握“面向对象”!
有时我们可能会问:模式虽好,但是不会使代码更复杂吗?
代码复杂与否很多时候是主观的。人们对模式的熟悉程度极大地左右他们如何看待基于模式的重构。当他们不熟悉某个模式时,会认为模式过于复杂,而熟悉了某个模式之后,通常就不会这么认为。
模式是前人智慧的结晶,重用这种智慧是非常有益的。通常,实现模式有助于去除重复、简化逻辑、澄清意图、提高灵活性。尽量地学习更多的模式,而不要认为模式太复杂而不使用模式。
但是,有些模式确实使代码更复杂。出现这种情况,就应该返回做进一步的重构(发现问题再处理,而不是凭空担心)。
应用设计模式的最好方式就是:重构为模式(Refactoring to Patterns)。也就是说,不是不加变通地套用模式,而是通过重构渐进地引入设计模式,这样才可能避免过度设计。重构使我们的注意力集中在去除重复、简化代码、澄清意图,从而使我们更明智地使用模式。
在哪里应用设计模式的一个重要指标就是:看哪里有变化点。
设计模式建立在对系统变化点的基础上进行,哪里有变化点,哪里应用设计模式。设计模式应该以演化的方式来获得,系统的变化点往往经过不断演化才能准确定位。
这个也有一个很有趣的比喻:变化点就像武功中的“破绽”。风清扬传授的“无招胜有招”的独孤九剑要诀,就是寻找对手的“破绽”,只要找到了对手的破绽在哪里,就把剑尖指向哪里,敌人即不战自败。应用设计模式的时候,要先找到哪里会发生(需求的)变化,然后在那里寻找合适的模式并运用。在不会发生任何变化的地方,是不需要使用设计模式的。
设计模式的危险就是:为了使用模式而使用模式,把任何需求都看作模式的拼凑,一开始就使用模式来设计。正如学习武功而痴迷于招式,同样会走火入魔。模式不是目的,目的是更好地设计。只有明智地使用模式,才能为我们带来模式的乐趣。