什么是设计模式?

模式是在一定场景下,针对某些问题的某些解决方案.

软件开发的过程中,总是遇到一系列相似的问题,比如,算法需要被其他同类算法代替,某个接口需要转换成要求的接口,创建不同对象的组合,对于这些我们经常遇到的问题,有人根据实践和经验总结出一套普遍适用的解决方法(上面对应策略模式,适配器模式,抽象工厂).

为什么要使用设计模式?

首先没有模式,我们也可以完成工作,不适用抽象工厂,我们可以加条件判断要依赖哪些类,并逐个用 new 实例化.那为什么还要使用模式呢?

使用设计模式的目的,是为了使软件更从从容地应对变化.具体体现在,尽可能小范围地改动代码,注意,不是更少地写代码,引入模式有可能会让我们写更多的代码(比如命令模式和状态模式).

尽可能小,意味着,代码只需要在一个或者几个特定的类中做更改,或者只需要添加几个相似的类,而不是分散地感觉混乱地对代码各处做修改.

简而言之,设计模式将变化封装起来,使得改变更容易被控制.

(记得我毕业找的第一份工作,公司做的产品是一个监控平台,要兼容不同厂商的 SDK,不同厂商 SDK 接口差别有大有小,以前写代码的人也不怎么懂设计模式,结果就是,有时要添加一个新型号设备,或者升级一下 SDK,要从不同文件不同方法做 n 处修改.现在我还经常回忆起那个长达8000行的方法,里面嵌套了 n 层 switch,找个匹配的括号都是如此困难…)

什么时候使用设计模式?

我认为有以下两个情景该考虑用设计模式.

  1. 假如在做设计的时候明确知道未来的变化(而不是靠猜测),那你就应该用设计模式将变化的部分封装起来.
  2. 假如你正在重构代码,那么你应该考虑将导致系统丑陋的代码(那通常就是始料未及的变化),并也要顾及到将来会变化的代码,应用某些设计模式,使得模块或者系统当前的代码变得整洁,也能够兼顾将来的变化.

什么时候不应该使用设计模式?

不知道将来明确的变化,只是凭借自己的假象,这时应该放弃应用设计模式的冲动.

当前系统已经足够复杂,不想继续扩充其功能,这时应该尽量少对代码进行重构,意图是尽量少地容纳将来的变化,以免使系统无法维护.

如何应用设计模式?

当你确定自己需要用设计模式,并觉得此处应该用某个模式会解决你的问题,你应该在对照一下这个列表,再考虑一下:

  • 你的场景是否与此模式的应用场景吻合.
  • 你期望的结果是否与此模式的意图相吻合.
  • 你是否要对这个模式做一些修改,使得模式更适用你的场景.
  • 结合业务场景,确定模式的参与者及他们的协作关系(比如,观察者模式,哪些类会被作为主题,哪些类是观察者).
  • 当前使用的语言,在实现这个模式是不是有值得注意的地方(比如单例模式中的并发问题).