手撕设计模式-总览

目录

背景

概述

 设计原则

23中设计模式&分类

 根据目的划分

根据作用范围划分

总结


背景

设计模式是任何一个程序都不能绕开的话题,在各大厂的面试中也总是会出现。以前工作中也是经常用到,比如手写数据库连接,获取数据源;还有封装Redis的工具,等等与之类似的我们往往都会用工厂模式。给大家讲个小故事,我们之前在做云服务,开源了很多API和SDK出去了,在审核代码的时候,我们就提到了要不要用一些设计模式把代码写的高大上一些,我们考虑到用户的水平可能参差不齐,就没有用任何技巧,抱着任何水平的程序员,哪怕你是刚毕业的大学生也能看懂的心态,用最简单的方式实现了,结果在我们的评论区,遭到了好多用户的吐槽。后来我们重新写了一遍,做了进一步的抽象封装,适当的加了设计模式等等融入了一些技巧,后来就没有人吐槽了。一些框架的源码我也浏览不少,设计模式到处可见,大部分用的都恰到好处。也有一些写的很绕的,费时费力还不容易理解。追求简单、易懂不能变,好的设计思想、技巧要用,如果不用,写的太素,也不是编程的精髓。所以我鼓励大家去用这些设计思想,但是不要为了用而去用,更不要炫技。

概述

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
“设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。但是咱们以四人帮的位起点开始讲。
1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。

手撕设计模式-总览_第1张图片

这 23 种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性继承性多态性,以及类的关联关系组合关系的充分理解。

 设计原则

  • 学习设计模式,首先要了解设计原则,有说六大原则,也有说七大原则的。我会按六大原则来介绍,在代码落地的过程中第七原则贯穿始终。都是为了达到高内聚、低耦合
  • 六大原则:开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则、合成复用原则;业内把开闭原则称为总纲,合成复用原则就是人们说的第七大原则。我个人的经验是能组合不继承。下面每个原则用一句话简单概括下。
  • 开闭原则:对扩展开发,对修改关闭。开闭原则是目的,其他原则是实现手段,所以开闭是总纲
  • 里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说:子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法。这么定义的目的是解决重载/重写父类方法给系统带来的不可预期的错误。
  • 依赖倒置原则:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。
  • 单一职责原则:规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分。即一个类或者接口只做一件事。重点在约束类上
  • 接口隔离原则:要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。终点在接口上,一个类对另一个类的依赖应该建立在最小的接口上。
  • 迪米特法则:又叫最少知识原则,只与你的直接朋友交谈,不跟“陌生人”说话。其含义是:如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。
  • 合成复用原则:又叫组合/聚合复用原则。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果继承要遵守里氏替换原则。

23中设计模式&分类

目前流行的有两种分类方式 :

  • 根据模式的目的来分;这种方式可分为创建型模式结构型模式行为型模式3种
  • 根据模式的作用的范围来分;这种方式可分为类模式和对象模式两种。

 根据目的划分

  • 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF中提供了单例、原型、工厂方法、抽象工厂、建造者等5种创建型模式。
  • 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF种提供了代理、适配器、桥接、装饰、外观、享元、组合等7种结构型模式。
  • 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF种提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等11种行为型模

根据作用范围划分

  • 1.类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻确定下来了。GOF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。
  • 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GOF中除了以上4种,其他的都是对象模式。
范围\目的 创建型模式 结构型模式 行为型模式
类模式 工厂方法 (类)适配器 模板方法、解释器
对象模式 单例、原型、抽象工厂、建造者 代理、(对象)适配器、桥接、装饰、外观、享元、组合 策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录

总结

  • 通过总结这些知识点,使我对代码有了重新的认识,在写代码的过程中要在适当的场景一定要用,而且要大胆的用,不要怕麻烦和难理解;
  • 按照这个原则写代码,也许这就是代码本来的样子;
  • 后面我再写代码的时候会回归到这个上面来,形成规范和习惯,尽量避免随意的写法。

你可能感兴趣的:(设计模式,设计模式,java)