Head First 设计模式各模式思想及总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ocp114/article/details/82928893

虽然接触设计模式很久了,但是以前没有做笔记,也没留下什么代码,只怪当初太年轻呀~现在要重新回顾了。记住,设计模式注重的是思想,并不是具体实现,不要被设计模式限制了自己,也并不是我们写代码一定要想着怎么用设计模式来实现出来,按照设计模式的规范设计出来,一般情况下,把代码封装好,把变化的东西封装好,对外暴露不变的方法或接口,代码按照功能模块拆分成类和方法,做到这些已经可以让后来看自己代码的人不骂自己了,哈哈哈,还是那句话,实际问题,实际解决。

一、设计模式的三大类

  1. 创建型模式: 主要解决对象创建实例化的问题,使得对象的创建解耦
    • 工厂方法模式、抽象工厂模式、单例模式、生成器模式、原型模式
  2. 结构型模式: 解决类和类或类和对象如何结合在一起的问题,进而产生其他更有效用的功能结构
    • 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
  3. 行为型模式: 解决类和类或类和对象之间沟通(调用)的问题,模式中主要体现的责任的划分以及算法的运用
    • 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

二、各模式关键思想

  1. 工厂方法模式:体现为工厂方法接口,让实现类去决定要生产哪种类的实例,常常需要传参数进去,实现类判断,然后在实例化
  2. 抽象工厂模式:连工厂都抽象出来了,抽象工厂里面有一套的方法,规范实现类的行为,再用另外一个类来统一调用,这种方式开发的时候比较常见
  3. 单例模式:想办法让该类的实例在全局只有唯一一个
  4. 生成器模式:这个千万不要和模板方法搞混哦,这里的主要思想是封装实例构造过程,常常会传入一些参数,然后会生成实例出来
  5. 原型模式:解决一个大的结构体里面有各个小结构体会有不同变化的问题,体现了下面面向对象设计里面的组合一些原理,小结构体被拆分为类,实例化后,传进去大的结构体,大的结构体使用小的属性来完成实例化
  6. 适配器模式:按照现实中的电源适配器或者其他转换插头来理解就好了,某个类调用后的返回值并不适合另外一个类的使用,这时候,构建一个中间类来完成这个返回值的适配
  7. 组合模式:这个比较好理解,把多个对象组合起来,形成另外一个更加统一,功能更加丰富的类
  8. 装饰器模式:JDK 里面就有常用的了,流!往下就是输入流输出流,再往下就是文件输入流、字节输入流等,在流一层一层流动的过程中,不断对流进行装饰处理添油加醋的过程
  9. 代理模式:类似于景点门票代售点,去景点买和去代售点买是一样的,区别在于能使调用对象方法的开销减小;在 JDK中体现为 RMI
  10. 蝇量模式: 用于减少重复类的生成,把小对象(像苍蝇一样)抽象出来,成为一个独立的类,在调用的时候告诉你这个类是长什么样的(属性的值是多少),而不是在你实例化的时候就告诉你你长什么样,实例化之后就固定属性了,所以在需要构造大量同一个对象,但是属性会有差异的情况下,这个方法能大大提升系统性能
  11. 外观模式:把某一些都需要调用的方法或属性封装起来,组合成为一个整体,使之成为一个类似一键XXX的功能
  12. 桥接模式:例如 classA 和 classB 有类似的功能,classC 想要任意调用 classA 和 classB,难道分别写一套调用的逻辑吗?不,桥接模式这时候有用了,写一个桥接器,把 classA 和 classB 整合起来,只对外暴露相同的方法,外部只需要和桥接器对接就能够任意调用 classA 和 classB 了。ps:万能遥控
  13. 模板模式:某个类或者某个结构体里面有一套程序执行的模板,会把这套模板过一遍,所以需要子类实现相应的方法,在 Java 中常常以抽象类的形式出现
  14. 解释器模式:和程序的解析器差不多喇~在调用这个解析器的时候,会有一套语序和文法是和这个解释器配套的,只有按照这个解释器的规范来操作才能是解释器正确运行
  15. 策略模式:根据实际情况,对代码进行抽象,把变化部分抽象出来接口 + 实现,以达到更好的代码复用效果
  16. 状态模式:通过改变类的状态而改变类的行为,例如线程里面的等待状态、运行状态
  17. 观察者模式:加入 classA 需要观察 classB 的变化,那么 classA 需要有有一个订阅的过程,订阅之后,classB 变化的时候就会通知 classB 有变化了,而不是 classA 隔一段时间去查询 classB 有没有变化,是一个主动变被动的关系,类似于回调的机制
  18. 备忘录模式:就像一个备忘录的本子,你在里面写些什么它不管你,你需要的时候翻开看看就行,体现比较多的地方应该是数据存档了吧~
  19. 中介者模式:就拿售楼中介来举例吧,所有的卖家如果要修改楼房信息,告诉中介就行,中介这时候会公布出来让买家知道,起到一个沟通协调控制的作用,需要与代理模式以及桥接模式区别开来
  20. 命令模式:主要的思想还是抽象,把不变的封装起来,可变的东西参数化,例如 linux 里面的一个删除命令 rm a.txt,可以变形成为 rm b.txt、而不是固定死要删除 a.txt 的话只能用 rm a.txt,删除 b.txt 的话就变成 del b.txt 了
  21. 访问者模式:这个好像不太好理解,该模式重要的作用是方便对类属性的访问,主要通过双重委托的方式 classA 中注入 classB 并调用 classB 的方法来实现对 classA 的访问,如下图,还需要借助 Java 中抽象类的特性,使得继承 Element 和 Visitor 的子类实现访问的操作
    在这里插入图片描述
    在这里插入图片描述
  22. 责任链模式:加入有 classA、classB、classC 三个类,当 classD 执行一个操作有可能和前三个类都有关系的时候,先去问 classA,classA 反馈说“这不是我的责任”,然后回去问 classB,classA 说“这是我的责任啊,我来处理吧”,所以,把这个看做链结构,一级一级下去,就像平时的一家超市的商品出问题了,老板会一级一级查下来,找出责任人

需要提一句,设计模式是建立在面向对象的基础之上的,里面每一种模式从命名到代码实现,都是面向对象的体现

三、面向对象设计的原则

  1. 组合复用原则:多用组合,少用继承,在一个新的对象里面使用一些已有的对象,达到复用的做效果
  2. 依赖倒置原则:实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的;接口或抽象类不依赖实现类;实现类依赖接口或抽象类
  3. 开闭原则:核心思想是对于扩展是开放的,对于修改是关闭的,也就是说用抽象来封装不变量,在功能升级或修改的时候,尽量用拓展的方式来实现
  4. 迪米特法则:也称最少知道原则,在 Java 中体现较容易的就是 public、private 等控制作用域的关键字了,一些外界不应该知道或可以不知道的属性或方法就隐藏起来
  5. 里氏替换原则:简单理解,子类可以替换父类,所以要实现这个替换的话,子类就不能覆盖父类的方法了,因为覆盖的话,子类和父类调用相同的方法会有不同的结果
  6. 单一职责原则:每个类以及细化到每个方法,例如日期格式化,在其他地方尽量不要写重复代码了,其作用尽可能单一,粒度尽量减小,但是伴随而来的问题可能是类膨胀

上面无论哪种原则,其实都是为了程序运行得更好,以后拓展更加容易;这里要想做得好,还是需要不断重构代码才能真正提升编程能力,那么《重构》这本书又要掉坑了,哈哈哈哈哈!总之想着我写的代码,怎样才能让别人用得舒舒服服行~

猜你喜欢

转载自blog.csdn.net/ocp114/article/details/82928893