代码地址仓库: https://gitee.com/wslxm/xj-design-pattern
设计模式说明
模式 | 标记号 | 说明 |
---|---|---|
创建型模式 | 1 | 都是为了 为了初始化一个/多个对象 |
结构型模式 | 2 | 都是为了 解决如何组装现有的类 |
行为型模式 | 3 | 都是为了 分配算法和对象间的职责 |
简要概况 23 种设计模式
- 1-5 : 创建者模式 (5)
- 6-13 :结构型模式 (8)
- 14-25 :行为型模式 (12)
序号 | 设计模式 | 简要描叙 | 应用场景 |
---|---|---|---|
1+2 | 工厂模式 (1) Factory | 1、简单工厂 主要解决 接口选择的问题 2、抽象工厂可以组合不同子工厂的产品进行复合组合(如: 红色/青色 + 苹果/桃子等) 3、对产品进行统一的管理 | 1、数学计算 (加减乘除) 2、qq 换肤,一整套一起换 3、spring bend 工厂 |
3 | 单列模式 (1) Singleton | 同一个对象不能被重复创建 | |
4 | 建造者模式 (1) Builder | 对同一个目标进行频繁数据添加/插入操作的对象 | 1、java 的 StringBuilder 2、构建人物属性 (示例) 3、mybatis-plus 的 LambdaQueryWrapper 4、 @Builder / @SuperBuilder / @Accessors(chain = true) 注解 |
5 | 原型模式 (1) Prototype | 一个对象的数据拷贝到另外一个对象中(深拷贝) | 1、cglib 的 copier.copy 2、spring 的 BeanUtils.copyProperties |
6 | 适配器模式 (2) Adapter | 一个业务在多个实现逻辑中使用能处理该业务的实现 | 1、spring-mvc 的对不同配置适配来达到调用具体业务的方法 |
7 | 桥接模式 (2) Bridge | 通过大于等于两套(两种类型)不同的独立实现逻辑, 形成可 A+B 组合使用的功能增强 | 1、jdbc 数据源(驱动规范-Driver / 连接规范-Connection) 2、发送消息 (消息-(短信+邮件) 类型-(延时+非延时) |
8 | 过滤器模式 (2) Filter | 对一个对象或行为 进行一系列的判断操作 | 1、过滤用户数据(示例) 2、users.stream().filter() 3、spring-mvc 的 req 请求过滤器 |
9 | 组合模式 (2) Composite | 实体对象数据的 多层级数据 | 1、菜单层级数据 2、部门层级数据 |
10 | 装饰器模式 (2) Decorator | 使用新的类的接口对原类的接口实现业务功能增强 (原类=构造参数) | |
11 | 外观模式 (2) Facade | 把多个的类的接口聚合到一个类中并提供给外部使用 | |
12 | 享元模式 (2) Flyweight | 对常用数据进行唯一/ 组合 key 进行数据缓存 | 1、通过 id 对单条数据进行缓存 2、通过 code 对单条数据进行缓存 |
13 | 代理模式 (2) Proxy | 拦截接口, 实现业务接口前后的额外操作 | 1、spring 的 aop 2、jdk 动态代理 / cglib 动态代理 3、事务注解 4、方法调用前后日志记录/打印 |
14 | 责任链模式 (3) Chain of Responsibility | 对一个行为 创建多个执行逻辑 挨个进行执行 | Struts2 的拦截器 |
15 | 命令模式 (3) Command | 创建命令集容器, 根据传递不同的命令执行多个不同的实现来组合业务 | |
16 | 解释器模式 (3) Interpreter | 对一个字符串进行解析完成额外的逻辑操作 | 1、sql 2、SpEL 表达式 3、Hibernate的HQL 4、各引擎模板获取动态参数 |
17 | 迭代器模式 (3) Iterator | 隐藏容器数据, 让其只能一个一个的向下获取 | java 中集合的 Iterator |
18 | 中介者模式 (3) Mediator | 新类代理多个原类的实例,并加以控制 | 业务层聚合不同的业务实现功能整合 |
19 | 备忘录模式 (3) Memento | 保存状态, 便于对数据进行还原/恢复 | 1、浏览器回退 2、棋牌游戏悔棋 3、在线文档历史记录数据查看与还原 |
20 | 观察者模式 (3) Observer | 监听一个数据的变化, 并处理后续一系列后续逻辑 | 状态变化后给指定用户同时发送短信,及时消息,邮件等通知 |
21 | 状态模式 (3) State | 同一种行为根据不同的状态执行不同实现的逻辑 | ATM ( 1、业务: 取钱/存钱 2、状态:有钞/无钞/故障 |
22 | 空对象模式 (3) Null Object | 检查空数据和非空数据使用不同的实现 | |
23 | 策略模式 (3) Strategy | 一个接口多个实现类,调用方指定具体的实现 | 1、支付 (微信 / 支付宝 / 银联) 2、登录 ( 账号密码 / 手机号 / qq登录) |
24 | 模板模式 (3) Template | 把多个逻辑的代码 聚合到一个方法中调动 | |
25 | 访问者模式 (3) Visitor | 一个接口多个实现类 和 多个相同方法但不同的入参获取不同的结果 (入参对象=访问者) |
1+2、工厂模式(1)
由工厂创建示例,用户只关心工厂是谁就可以了
1.1、数学计算
我需要对某一个数进行加减乘除运算,创建运算工厂, 分别实现 加,减,乘,除 等操作
示例图:
代码位置: design_1_factory.demo1
1.2、spring bend 工厂
根据不同的bend获取不同的 service 实例对象
代码位置: design_1_factory.demo2
1.3、qq 换肤,一整套一起换
代码位置: design_1_factory.demo3
3、单列模式(1)
这个没什么案例,就是让一个对象不可被重复创建
4、建造者模式(1)
建造者模式则是将各种产品集中起来进行管理,与工厂模式的区别是:建造者模式更加关注与零件装配的顺序
4.1、JAVA 中的 StringBuilder
代码位置:design_4_builder.demo1
4.2、构建一个完整游戏人物
代码位置:design_4_builder.demo2
5、原型模式 (1)
这个没什么案例,就是 A对象 数据拷贝给 B对象
6、适配器模式 (2)
可参考一篇比较好的文章:https://blog.csdn.net/enterpc/article/details/120998787
6.1、SpringMVC 的 HandlerAdapter 适配器
SpringMVC 源码 DispatcherServlet 下doDispatch 操作 HandlerAdapter 获取与调有
手动实现示例:
代码位置:design_6_adapter.demo1
6.2、OutputStreamWriter / InputStreamReader 字符/字节适配器
待定
7、桥接模式
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
7.1、发不同的 延时消息 和 即时消息
- 消息类型 :即时消息,延时消息(抽象)
- 消息分类 :手机短信,邮件消息,QQ消息(实现)
代码位置:design_7_bridge.demo1
8、过滤器模式
8.1、对查询的 用户数据进行数据过滤
UserAgeFilter 过滤 age >=20 的数据
UserStateFilter 过滤 state=1 的数据
UserUserNameFilter 过滤 name=王五 的数据
代码位置:design_8_filter.demo1