设计模式--23种设计模式,实际使用示例演示Demo-- (内容更新中)(2022)

代码地址仓库: 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

针对23种设计模式,分别写了demo并画了类图帮助理解。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 二、设计模式的六大原则 1、开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计我们会提到这点。 2、里氏代换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文多次出现:降低依赖,降低耦合。 5、迪米特法则(最少知道原则)(Demeter Principle) 为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。 6、合成复用原则(Composite Reuse Principle) 原则是尽量使用合成/聚合的方式,而不是使用继承。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值