十三 设计模式

工厂模式 :spring中使用(目的是:解耦)
1.简单工厂
- 所有的产品都共有一个工厂,如果新增产品,则需要修改代码,违反开闭原则·
- 是一种编程习惯,可以借鉴这种编程思路
2.工厂方法模式
- ·给每个产品都提供了一个工厂,让工厂专门负责对应的产品的生产,遵循开闭原则
- · 项目中用的最多
3.抽象工厂方法模式
- ·如果有多个纬度的产品需要配合生产时,优先建议采用抽象工厂(工厂的工厂)
- 一般的企业开发中的较少
策略模式
13.1 简单工厂模式






13.2 工厂方式模式


13.3 抽象工厂模式



13.4 策略模式
- 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户
- 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中
- 它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理
策略模式的主要角色如下:
- 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口
- 具体策略(Concrete Strategy)类: 实现了抽象策略定义的接口,提供具体的算法实现或行为。
- 环境(Context)类:持有一个策略类的用,最终给客户端调用





13.5 登录案例(工厂模式+策略模式)







在getTypes中获取胚配置中所有的types,遍历后存入到Map中,
spring生命周期中有aware,此时提供applicationContext上下文对象,就会获取bean当如到Map的value中




完成 根据不同的参数完成不同的策略
1.其他案例(策略) 举一反三
- 订单的支付策略(支付宝、微信、银行卡...)
- 解析不同类型excel(xls格式、xlsx格式)
- 打折促销(满300元9折、满500元8折、满1000元7折..)
- 物流运费阶梯计算(5kg以下、5-10kg、10-0kg、20kg以上)
一句话总结:只要代码中有长的 if-else 或 switch 分支判断都可以采用策略模式优化
2.其他案例(工厂方法+策略)
- 介绍业务(登录、支付、解析excel、优惠等级...)
- 提供了很多种策略,都让spring容器管理
- 提供一个工厂:准备策略对象,根据参数提供对象
13.6 责任链设计模式
责任链模式:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止
- 抽象处理者 (Handler)角色: 定义一个处理请求的接口,包含抽象处理方法和一个后继连接.
- 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者
- 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程









