认识设计模式

Aaron 2020-11-08 10:54:11
设计 认识 技术开发 SegmentFault 模式


最近在学习JavaScript设计模式,对于刚刚起步的小白来说,对有些东西还是很模糊的,所以整理成书面的形式,以免以后忘记,可以反复的看一下。

什么是设计模式?

模式是一种可复用的解决方案,可用于解决项目开发设计中遇到的常见问题,比较我们在编写JavaScript应用程序的实例中。我们定义一个模板,这个模板可以对应多种情况,设计模式也是如此。但是, 你不能像使用现成的函数或程序库那样, 拿来某个模式就将其套用到自己的程序中。 模式并不是一段特定的代码, 而是用于解决特定问题的一般性概念。

大部分模式都有正规的描述方式, 以便在不同情况下使用。 模式的描述通常会包括以下部分:

  • 简单描述问题和解决方案。
  • 将进一步解释问题并说明模式会如何提供解决方案。
  • 展示模式的每个部分和它们之间的关系。
  • 在不同语言中的实现提供流行编程语言的代码, 让读者更好地理解模式背后的思想。

部分模式介绍中还列出其他的一些实用细节,例如模式的适用性、实现步骤以及与其他模式的关系。

设计模式类别

设计模式以类型划分主要分为三大类型,创造型设计模式、结构型设计模式、行为设计模式,三种类型设计模式中又包含了更多的是设计模式。

一、创造型设计模式

创建型设计模式是一类处理对象创建的设计模式,通过某种方式控制对象的创建来避免基本对象创建时导致设计上的问题或增加设计上的复杂度。

创造模式包括:

  1. 简单工厂 - 定义一个对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中
  2. 工厂方法 - 基于接口数据或事件生成几个派生类的一个实例
  3. 抽象工厂 - 创建若干系列的一个实例,无需详述具体的类的作用
  4. 原型 - 用于复制或可克隆完成初始化的实例
  5. 单例 - 一个类在全局只有唯一的一个实例
  6. 生成器 - 表示中分离对象构建,使用相同的创建代码生成不同类型和形式的对象
二、结构型设计模式

结构型模式与对象组合有关,通常可以用户找出在不同对象之间建立关系的简单方法。这种模式有助于确保在程序某一部分发生变化时,系统的整个结构无需同时改变,同时对于不适合因某一特定目的而改变的系统部分,这种模式也能够帮助它们完成重组。

创造模式包括:

  1. 装饰者 - 向对象动态添加备选处理方法
  2. 外观 - 隐藏整个子系统复杂性的唯一一个类
  3. 享元 - 一个用于实现包含在别处信息的高效共享的实例,在有限的内存容量中载入更多对象
  4. 适配器 - 匹配不同类的接口,因此类可以在不兼容接口的情况下共同工作
  5. 代理 - 占位符对象代表真正的对象,提供对象的替代品或其占位符,代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理
  6. 桥接模式 - 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构
  7. 组合模式 - 将对象组合成树状结构,并且能像使用独立对象一样使用它们
三、行为设计模式

行为模式专注于改善或者简化系统中不同对象之间的通信。

行为模式包括:

  1. 迭代器 - 顺序访问一个集合中的元素,无需了解该集合的内部原理
  2. 中介者 - 在类之间定义简化的通信,以防止一组类显示引用彼此,迫使他们通过一个中介者对象进行合作
  3. 观察者 - 向多个类通知改变的方式,以确保类之间的一致性
  4. 访问者 - 将算法语气作用隔离开
  5. 责任链 - 沿着处理者链进行发送,收到请求后,每个处理者均客队请求进行处理,或将其传递给链上的下个处理者
  6. 命令模式 - 将请求转换成一个包含于请求相关的所有信息的独立对象,根据不同的请求方法,参数化,延迟请求执行或将请求执行放入队列中,且能实现可撤销操作
  7. 备忘录 - 再不暴露对象实现细节的情况下保存和恢复对象之前的状态
  8. 状态模式 - 再一个对象的内部状态变化是改变其行为,使其看上去就像改变了自身的所属类一样
  9. 策略模式 - 定义一系算法,并将每一种算法分别放入独立的类中,以使算法的对象能够相互替换
  10. 模板方法 - 在超类中定义一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤

超类:被继承的类一般称为“超类”,也有叫做父类。是继承中非常重要的概念,它和子类一起形象地描述了继承的层次关系。超类设计的好与不好,首先看其内部重用率的高低,内部重用率高,必然外部重用率也高。

设计模式有什么好处

既然学习设计模式,当然也会对我们的工作,带来很多好处,否则设计模式存在的价值也就不复存在了。设计模式不光带给我们的并不只是良好的编码规范,其中最重要的可能是思想。

升值加薪

几乎所有关于编程的工作面试和考核中都会有关于模式的问题。了解这些知识能够帮助你发现更广泛的工作机会, 或者实现升职加薪的工作目标。

增强代码质量

模式能让你对已有的解决方案进行自定义, 而不用完全自行开发。 代码中的错误将更少, 因为你使用的是经过证明的标准解决方案, 它考虑了所有隐藏的问题。

利于团队协作

设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。你只需将模式的名称告诉给程序员,而不需要长篇累牍地解释自己那绝妙的设计思想以及其中各个类的作用。 不费吹灰之力就能搞定同事之间的沟通。你只需说“哦,这里用单例就可以了”,所有人都会理解这条建议背后的想法。只要知晓模式及其名称,你就无需解释什么是单例。

更快的解决问题

设计模式是针对软件设计中常见问题的工具箱,其中的工具就是各种经过实践验证的解决方案。 即使你从未遇到过这些问题,了解模式仍然非常有用,因为它能指导你如何使用面向对象的设计原则来解决各种问题。

反模式

反模式是软件开发中被认为是坏编程实践的某些模式。用来解决共性问题从而带来得不良的解决方案。与设计模式不同的是,设计模式是解决常见问题的常用方法,这些常见问题已经正式化,通常被认为是一种良好的开发实践,而反模式则是相反的,是不可取的。

有人认为反模式是由于将通常使用的设计模式用在了错误的地方,也有人认为反模式只是一种坏习惯。简单的来说,反模式是指在对经常面对的问题经常使用的低效,不良,或者有待优化的设计模式/方法。甚至,反模式也可以是一种错误的开发思想/理念。

反模式的流行背后都存在很有说服力的原因,但反模式对可维护性和软件的长期发展有着更为严重的影响。 按照技术债务的说法,每次选择捷径都会产生隐含的代价,而这些代价在将来的某一时刻总要偿还。 那些推迟的重构不仅会影响下一次变更,而且会像经济债务一样持续地叠加利息。

总结

本文主要对设计模式做了一些简单的认识和了解,接下来的一段时间笔者会不定时更新,上述所说的23种设计模式。接下来的时间我们就一起学习设计模式吧。

在学习过程中不要太纠结于代码,学会并理解其中的思想即可,熟练掌握并能运用其种思想在实际开发的项目中,你会发现自己成长了很大一截。

版权声明
本文为[Aaron]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000037761016

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云