设计模式【精简概述, 应用场景】(个人总结)

   声明:
      1. 本文为我的个人复习总结, 并那种从零基础开始普及知识内容详细全面, 言辞官方的文章
      2. 由于是个人总结, 所以用最精简的话语来写文章
      3. 若有错误不当之处, 请指出

Gof23设计模式分为三类:

  1. 创建型模式 负责组件的创建

  2. 结构型模式 负责组件的定义

  3. 行为型模式 负责组件的使用(服役)

七大设计原则:

  1. OCP开闭原则: 对扩展开放, 对修改关闭; 扩展新类而不是修改旧类

  2. 依赖倒置原则: 面向抽象的接口编程,而不是面向具体的类

  3. 单一职责原则: 每个类只负责自己的事情, 而不是变成一个万能类

  4. 接口隔离原则: 各个类建立自己的专用接口,而不是建立万能接口

  5. 合成复用原则: 优先使用类的组合, 其次再使用继承

  6. 里氏替换原则: 继承父类而不去改变父类

  7. 迪米特法则: 无需直接交互的两个类, 如果需要交互, 请使用中间者

一、创建型模式:

创建型模式关注点是"怎样创建出对象"

优点:

  1. 将对象的创建与使用分离

  2. 降低系统的耦合度

  3. 使用者无需关注对象的创建细节

单例模式:

保证只有一个对象

实际应用:

  1. java.lang.Runtime:

    体现了饿汉式单例

    System.gc( ), System.exit( ) 底层调用的都是Runtime实例

  2. Collections集合工具类里的空集合

    体现了内部类懒汉式单例

  3. 上下文(环境)对象

三种工厂模式:

对象的创建由相关的工厂来完成

  1. 工厂方法模式:

    • 简单工厂

      一个方法, 内部使用if-else判断 (不利于OCP原则)

    • 工厂方法

      多个方法, 每个产品一个方法 (好了些, 但依旧有些不利于OCP原则)

  2. 抽象工厂模式

    很多工厂类 (有利于OCP原则)

建造者模式:

对象的创建由一个建造者来完成; 工厂模式是生成一个个零件, 建造者模式不仅生成零件, 而且还将这些零件进行组合;

set方法链式调用, 每个参数都可以传入但不是必须, 最后.build( )返回创建的实例 实际应用: StringBuilder的append( )方法

原型模式:

克隆一个自己出来

二、结构型模式:

结构型模式关注点是"怎样组合类/对象"

分为两种:

  1. 类结构型模式 通过继承来实现

  2. 对象结构型模式 通过属性组合来实现

根据合成复用原则, 第二种更好

适配器模式:

连接两个接口, 使两个不兼容接口进行适配

实际应用:

  1. Tomcat将自身的tomcat.Request转为标准的servlet.Request

  2. IO转换流

桥接模式:

连接同一个东西的两个不同维度

实际应用: IO转换流

过滤器模式:

类似职责链模式

组合模式:

对象间进行属性组合

外观模式:

去医院看病可能要去挂号、门诊、取药, 让患者觉得很复杂, 如果让接待人员来处理这些事情, 就很方便

接待人员就是外观

享元模式:

共享池技术, 使对象可以复用

实际应用: 连接池 & 线程池 & 字符串常量池

装饰者模式:

向一个现有的对象添加新的功能,同时又不改变其结构; wrapper一下使功能更强大

实际应用:

  1. IO流的 包装流(处理流)对节点流的包装

  2. 分布式Session中使用Redis存储

  3. MyBatisPlus中QueryWrapper的包装

代理模式:

  1. 静态代理

    代理类和非代理类必须得实现了同一个接口, 即只能代替兄弟类

    实现: 通过普通方法调用来实现

    静态代理等效于装饰

  2. JDK动态代理

    代理类和非代理类不必非得实现了同一个接口, 只要被代理类实现任意接口都行

    实现: 通过invoke方法反射调用来实现

    实际应用: RPC框架里的远程调用, 使调远程API就如调本地API一样便捷

  3. CgLib动态代理

    代理类即使没有父接口也行, 类别被final修饰就行

    实现: 通过动态生成其子类来实现

    实际应用:

    1. Spring的AOP, 如拦截器, 事务, 日志

    2. MyBatis根据Mapper接口生成其代理类

三、行为型模式:

行为型模式关注点是"怎样运行使用 类/对象"

分为两种:

  1. 类行为型模式 通过继承来实现

  2. 对象行为型模式 通过属性组合来实现

根据合成复用原则, 第二种更好

模板方法模式:

父类做出了个模板, 即实现了一部分内容, 另一部分靠子类自己实现

实际应用:

  1. JDK抽象类

  2. AQS允许自定义实现类

  3. RedisTemplate允许自定义实现类

策略模式:

每一种算法封装成一个策略, 根据不同的策略来调用不同的方法

实际应用: 创建线程池时传参的几种拒绝策略

状态模式:

和策略模式分像, 但状态需要维护状态改变(即状态流转)

命令模式:

Controller, Service, Dao中, 上一层有一个属性指向着下一层的对象, 然后使用此属性调用下一层的方法来处理业务

实际应用: 经典的MVC三层架构

职责链模式:

Filter(方法调用时会压栈递归) + 维护链条FilterChain + 游标(相当于下标位置, 第几个Filter)

实际应用: Tomcat过滤器的底层是 结合FilterChain进行Filter过滤

观察者模式(发布订阅模式):

当一个对象状态发生改变时,其被依赖的 进行观察的对象都得到通知

实际应用:

  1. Redis的哨兵

  2. Vue(视图和数据)的双向绑定

中介者模式:

一个中介对象来封装一系列其他对象的交互, 调用方只需要调用中介着即可, 而不用多次调用其他对象

迭代器模式:

遍历本类里面的集合

实际应用: Collection集合的遍历

访问者模式:

XiaoAiRobot类能访问自己的cpu和disk, XiaoAiRobot构造器参数传入Visitor类,

且Visitor也能访问XiaoAiRobot的cpu和disk, 对其进行升级

备忘录模式:

快照保存其状态

实际应用:

  1. Hadoop, Flink的检查点 持久化保存

  2. Session的活化钝化

    如果网站的Session的个数过多的话,就把Session序列化到硬盘中,如果用户再访问的时候再把Session数据反序列化到内存中

解释器模式:

抽象语法树的解析, 语法分析, 语义分析

实际应用: 编译器, MyBatis #{ }的解析

IO流使用了: 装饰者模式, 享元模式, 适配器模式, 桥接模式

线程池使用了: 享元模式, 工厂模式, 策略模式

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值