🏗️ 什么是设计模式

what-does-it-do.gif

🔘 定义

代码设计中常见的问题的解决方案的总结。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的,用于对常见建筑设计的归纳。

可是在学习的过程中,我发现其实设计模式并没有解决什么问题,书中提出的问题,即使不学习,也能写出另一种答案。与书中方案进行对比之后,发现了:

  • 我的代码并不如书中的优雅和容易扩展
  • 我不能准确整理出我的代码的特性、规律和维护方案

综上,设计模式应该是一种更容易扩展的代码模型,更优雅的实现方式,比起「解决问题」更像是一种「优化方案」。所以,它最大的好处是——

基于约束进行设计,根据审美进行创造。

💡 设计模式分类

与书中的分类方式「创建型-结构型-行为型」不一样,我分成四类:
how-to-sort.gif

  • 对象(功能):对对象功能进行加工、扩展,包含「命令、策略、装饰者」模式
  • 访问:对访问途径进行加工、扩展,包含「工厂、组合、迭代器、适配器、代理、单例」模式
  • 过程:对过程进行加工、控制、扩展,包含「模版、状态、中介者」模式
  • 消息:增加广播提示的函数库,包括「观察者、发布-订阅」模式

这个分类的方式,是我根据电灯的「灯泡(功能)-安装(过程)-访问(接口)-消息(通电)」这个最简约的设计来分的,一是符合事物的特性(本身 JS 就是面向对象设计的),二是方便记忆(想不起来时候抬头看一下就行了)。如果你有更好的分类方法,欢迎交流。

🏠 设计模式的功能

上面说了,设计模式就是各种大牛程序员给你总结的优化设计思路。其功能有 3:

  • 方便学习。这些软件通用的开发经验赋予「XX 模式」这样的名词之后,有利于学习、记忆和实践。
  • 方便交流。你跟其他程序员说“用 XX 模式实现更好”的时候,他就能马上领会。相当于数学里面的公式,给外行人解释需要各种解题步骤,给内行人就直接一个公式就行了,简洁而精准。
  • 方便维护。设计模式目的就是让代码具有良好的扩展性和可维护性。而且,如果代码都符合设计模式的话,那么这个模式就属于「类」,代码属于「实例」,对于归纳总结极有好处。

💬 遇到的疑问

“一定要学设计模式吗?”

不一定。
因为它的定义是“一种易于扩展和维护的模型”,你不用的话,你的代码一样能跑。但是如果遇到大项目,经常需要扩展、升级、优化,缺乏考虑的代码模型就只能重构了。
相信各位也见过不少,垃圾山一样的代码,和只考虑自己的拍脑袋型同事。要远离他们的话,请学好这些基础理论知识,才能进入有同样高编码水准的工作环境。

“你不觉得工作中要用的话,设计模式是硬套上去的吗?”

完全不觉得。
一般来说,普通程序员写的代码,普通一点的业务用结构化语句(顺序、if、for)就够了。但是复杂一点的设计,一定属于这几十种设计模式之一。大到 Vue 和 Axios 源码,小到写一个可拆分扩展的 router,都充满了设计模式。
其实并不是要你生搬硬套,而是请在编码之前,从扩展性和维护性出发,想好代码的模型,再动手。


机器马
307 声望8 粉丝

技术冲关,Work in English