设计模式归纳总结

1、前言

前两年工作中多有用到一些设计模式,但是除了早年在大学里学过一遍设计模式之后,一些不常用的设计模式渐渐忘记了。我意识到这是一件很可怕的事情,因为能在需要时恰好被想起的知识才是自己的知识,而我在忙碌中某些知识却默默遗失了。温故而知新,所以最近重新温习了一遍,有了新的领悟: 知识与知识之间是有关联的,学习不是靠死记硬背的,理解 + 输出 = 自己的知识。

划重点: 高效的学习方式应该是巧妙串联所有的知识,这里设计模式也是!

2、基本原则

世界上所有的真理都是从问题开始的。所以,在说哪几个基本原则之前提出几个问题:

  1. 在面向对象设计中,如果我把很多复杂的功能都放在一个类(我们假定这个类名叫A)不行吗? 为什么要按功能定义分开?
  2. 前面的类A设计好, 之后,但需求总是在变化的,如果每次修改都要修改它,
    会很容易出bug,怎么办?
  3. 假设前面的类A 是由算法B类实现的,现在希望用算法C类 来实现,又要改动到类A了,好麻烦啊,怎么办?
  4. 现在我学会了抽象,于是我把用户的功能都提炼成接口,第二天有新增了别的功能,有一定相关性,那么我是新建立一个接口还是继续在原有接口上新增?
  5. 假设现在A类提供了打印的功能,但此时有需要传真的功能,我用类D实现它,最后把D类提供给客户,这样让客户同时知道类A 以及 D 有什么问题 ?

问题的解决:

  • 一个类如果包括了超过一个功能,那么以后它就有多个被修改的理由了,功能越多,修改的机会就越大,它就会变成大杂烩,越来越复杂,越来越难以维护,修改一点点就会出个bug。
    所以,前人提炼出第一个基本原则 :单一职责
    每一个类都应该有则仅有一个功能,这样后面维护性就很强;

  • 当软件需要变化时,我们应该尽量通过扩展的方式来达到,而不是修改已有的代码来实现,这样可维护性强,问题也少。所以,这里引出第二个原则: 开闭原则

  • 对于第三个问题,回想到面向对象设计的3大特点就是: 继承、封装和多态。
    所以,对于对于同一个算法行为,我们可以定义的抽象类,然后类B 以及 类 C 继承实现具体的算法思想,然后在A中只需要引用抽象父类即可,怎么换都不需要变化了。这里的思想包括了2个原则:

    • LSP : 里氏替换原则,所有引用基类的地方都可以用子类来代替
    • DIP : 依赖倒置原原则,细节应该依赖于抽象,而抽象不应该依赖细节,因为细节总是变化的,而抽象总是不变化的
  • 第4个问题: 最好的方式是新建接口,因为新增的功能不一定是原有所有使用方都需要的,如果加上,势必对他们造成困扰。所以这里引出第五个原则:
    ISP 接口隔离原则,即客户端不应该依赖于它本不需要的接口,这就要求我们接口的设计应该越简单,越原子越好

  • 最后的问题: 如果接入一个SDK ,SDK提供的接口有很多个类,一会是类A 一会是类D ,那肯定被骂死。有没有最简单的统一的接口,能不能给客户一个最直接的接口? 所以,这里就有了第6个原则: 最少知识原则,也叫迪米特原则,也就是说,一个类应该对自己需要耦合使用的类知道得越少越好,不要搞那么多乱七八糟的,太不清晰了

至此,我们通过问题引出了6大原则。

接下来,围绕6大原则,有23个具体应用的模式,从用途上,他们可以分为 建造型、结构型以及行为型:

3、建造型模式

image.png

4、结构型模式

image.png

5、行为型模式

image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 9,188评论 0 14
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 14,530评论 2 59
  • 缘起 为什么会想着去面试了,这个事情好像我之前的一篇被封的文章里有透露,大意是很长时间沉浸在自己的世界里,没有出来...
    三杯水Plus阅读 11,752评论 14 14

友情链接更多精彩内容