对设计模式的一点理解

说起设计模式,不得不提的是GoF23种设计模式,这些设计模式是在历史性的一本经典著作《设计模式:可复用面向对象软件的基础》被描述的,这本书的四位作者并称为Gang of Four(GoF) 。由于这本书极具影响力,所以我们通常所说的设计模式就隐含地表示为“面向对象设计模式”,但这并不意味着“设计模式”就等同于“面向对象设计模式”。

很多人认为设计模式就是一种法则或一种解决方案,认为只要使用设计模式就可以提高设计的质量。在我还没有接触设计模式之前也认为是这样。然而这种观点是不正确的,设计模式不是我们必须遵守的法则,也不是解决方案,而是与一定的上下文相关的并且综合各种考虑的选择,是在一种特定的场景中权衡各方面利弊的一种方案的选择,这种选择是这些利弊平衡的结果,获得好处的同时我们也会付出相应的代价,所以并不是任何情况都能使用设计模式,更直观地说就是在权衡了利弊之后,只有当利大于弊的时候使用设计模式才对我们有用,否则只会适得其反,给我们的设计带来麻烦。是否采用设计模式取决于项目是否有符合模式的场景,并且所付出的代价是否在我们可接受的防范围之内,有时候处理一些简单的问题不使用设计模式同样可以很好地解决,所以在使用设计模式时应该慎重以避免发生不必要的麻烦。

使用设计模式能提高我们的开发速度吗?这个问题应该从两个方面来考虑。短期来看使用设计模式可能会引进更多的对象和更复杂的装配关系,从而使程序有更多的动态状态,从局部来看结构变得复杂,不好理解而且测试困难,看起来事情好像变得更糟糕了,开发周期肯定会变长,然而这只是一种表面现象。如果从项目的整个开发周期来看,合理地使用设计模式会使程序结构变得更健壮,维护性更好。现在的软件开发客户的需求不可能使一成不变的,一个结构不好的程序有可能前期的开发书的很快,但客户的需求一但发生变化,就需要花费更多的时间和精力来维护。所以从长远来看或是说从软件的整个生命周期来看,在使用设计模式时所花费的时间和精力是为后期的维护带来更多的方便,是值得的。

因为现在我们所说的设计模式是指面向对象设计模式,所以学习设计模式是建立在理解面向对象的基础之上。说起面向对象我们通常会想到面向对象语言,如C++、C#、JAVA等。这些语言之间是有区别的,但他们都对面向对象三大机制支持,即:“封装、继承、多态”。但面向对象语言并不是面向对象的全部,面向对象语言用得很熟也不能说明就很了解面向对象了。我也是才刚刚起步,还在不断努力之中,当然谈不上对面向对象有多深的理解,但我认为理解这种思想是很重要的,不要误以为会点面向对象语言就以为精通面向对象了。