声明:
1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识内容详细全面, 言辞官方的文章
2. 由于是个人总结, 所以用最精简的话语来写文章
3. 若有错误不当之处, 请指出
Gof23设计模式分为三类:
-
创建型模式 负责组件的创建
-
结构型模式 负责组件的定义
-
行为型模式 负责组件的使用(服役)
七大设计原则:
-
OCP开闭原则: 对扩展开放, 对修改关闭; 扩展新类而不是修改旧类
-
依赖倒置原则: 面向抽象的接口编程,而不是面向具体的类
-
单一职责原则: 每个类只负责自己的事情, 而不是变成一个万能类
-
接口隔离原则: 各个类建立自己的专用接口,而不是建立万能接口
-
合成复用原则: 优先使用类的组合, 其次再使用继承
-
里氏替换原则: 继承父类而不去改变父类
-
迪米特法则: 无需直接交互的两个类, 如果需要交互, 请使用中间者
一、创建型模式:
创建型模式关注点是"怎样创建出对象"
优点:
-
将对象的创建与使用分离
-
降低系统的耦合度
-
使用者无需关注对象的创建细节
单例模式:
保证只有一个对象
实际应用:
-
java.lang.Runtime:
体现了饿汉式单例
System.gc( ), System.exit( ) 底层调用的都是Runtime实例
-
Collections集合工具类里的空集合
体现了内部类懒汉式单例
-
上下文(环境)对象
三种工厂模式:
对象的创建由相关的工厂来完成
-
工厂方法模式:
-
简单工厂
一个方法, 内部使用if-else判断 (不利于OCP原则)
-
工厂方法
多个方法, 每个产品一个方法 (好了些, 但依旧有些不利于OCP原则)
-
抽象工厂模式
很多工厂类 (有利于OCP原则)
建造者模式:
对象的创建由一个建造者来完成; 工厂模式是生成一个个零件, 建造者模式不仅生成零件, 而且还将这些零件进行组合;
set方法链式调用, 每个参数都可以传入但不是必须, 最后.build( )返回创建的实例 实际应用: StringBuilder的append( )方法
原型模式:
克隆一个自己出来
二、结构型模式:
结构型模式关注点是"怎样组合类/对象"
分为两种:
-
类结构型模式 通过继承来实现
-
对象结构型模式 通过属性组合来实现
根据合成复用原则, 第二种更好
适配器模式:
连接两个接口, 使两个不兼容接口进行适配
实际应用:
-
Tomcat将自身的tomcat.Request转为标准的servlet.Request
-
IO转换流
桥接模式:
连接同一个东西的两个不同维度
实际应用: IO转换流
过滤器模式:
类似职责链模式
组合模式:
对象间进行属性组合
外观模式:
去医院看病可能要去挂号、门诊、取药, 让患者觉得很复杂, 如果让接待人员来处理这些事情, 就很方便
接待人员就是外观
享元模式:
共享池技术, 使对象可以复用
实际应用: 连接池 & 线程池 & 字符串常量池
装饰者模式:
向一个现有的对象添加新的功能,同时又不改变其结构; wrapper一下使功能更强大
实际应用:
-
IO流的 包装流(处理流)对节点流的包装
-
分布式Session中使用Redis存储
-
MyBatisPlus中QueryWrapper的包装
代理模式:
-
静态代理
代理类和非代理类必须得实现了同一个接口, 即只能代替兄弟类
实现: 通过普通方法调用来实现
静态代理等效于装饰
-
JDK动态代理
代理类和非代理类不必非得实现了同一个接口, 只要被代理类实现任意接口都行
实现: 通过invoke方法反射调用来实现
实际应用: RPC框架里的远程调用, 使调远程API就如调本地API一样便捷
-
CgLib动态代理
代理类即使没有父接口也行, 类别被final修饰就行
实现: 通过动态生成其子类来实现
实际应用:
-
Spring的AOP, 如拦截器, 事务, 日志
-
MyBatis根据Mapper接口生成其代理类
三、行为型模式:
行为型模式关注点是"怎样运行使用 类/对象"
分为两种:
-
类行为型模式 通过继承来实现
-
对象行为型模式 通过属性组合来实现
根据合成复用原则, 第二种更好
模板方法模式:
父类做出了个模板, 即实现了一部分内容, 另一部分靠子类自己实现
实际应用:
-
JDK抽象类
-
AQS允许自定义实现类
-
RedisTemplate允许自定义实现类
策略模式:
每一种算法封装成一个策略, 根据不同的策略来调用不同的方法
实际应用: 创建线程池时传参的几种拒绝策略
状态模式:
和策略模式分像, 但状态需要维护状态改变(即状态流转)
命令模式:
Controller, Service, Dao中, 上一层有一个属性指向着下一层的对象, 然后使用此属性调用下一层的方法来处理业务
实际应用: 经典的MVC三层架构
职责链模式:
Filter(方法调用时会压栈递归) + 维护链条FilterChain + 游标(相当于下标位置, 第几个Filter)
实际应用: Tomcat过滤器的底层是 结合FilterChain进行Filter过滤
观察者模式(发布订阅模式):
当一个对象状态发生改变时,其被依赖的 进行观察的对象都得到通知
实际应用:
-
Redis的哨兵
-
Vue(视图和数据)的双向绑定
中介者模式:
用一个中介对象来封装一系列其他对象的交互, 调用方只需要调用中介着即可, 而不用多次调用其他对象
迭代器模式:
遍历本类里面的集合
实际应用: Collection集合的遍历
访问者模式:
XiaoAiRobot类能访问自己的cpu和disk, XiaoAiRobot构造器参数传入Visitor类,
且Visitor也能访问XiaoAiRobot的cpu和disk, 对其进行升级
备忘录模式:
快照保存其状态
实际应用:
-
Hadoop, Flink的检查点 持久化保存
-
Session的活化钝化
如果网站的Session的个数过多的话,就把Session序列化到硬盘中,如果用户再访问的时候再把Session数据反序列化到内存中
解释器模式:
抽象语法树的解析, 语法分析, 语义分析
实际应用: 编译器, MyBatis #{ }的解析
IO流使用了: 装饰者模式, 享元模式, 适配器模式, 桥接模式
线程池使用了: 享元模式, 工厂模式, 策略模式