设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题。
设计模式遵循六⼤原则(SOLID):
- 单⼀职责Single-responsibility principle( ⼀个类和⽅法只做⼀件事 )
- 开闭原则Open–closed principle( 对扩展开放,对修改关闭 )
- ⾥⽒替换Liskov substitution principle( 多态,所有引用基类的地方必须能透明地使用其子类的对象 )
- 迪⽶特原则Law of Demeter( 最少知道,降低耦合 )
- 接⼝隔离Interface segregation principle( 建⽴单⼀接⼝ )
- 依赖倒置Dependency inversion principle( 细节依赖抽象,下层依赖上层 )
创建型模式 Creational Patterns
这类模式提供创建对象的机制, 增加已有代码的灵活性和可复用性。
序号 | 类型 | English Name | 业务场景 | 实现要点 |
1 | ⼯⼚⽅法 | Factory Method | 多种类型商品不同接⼝,统⼀发奖服务搭建场景 | 定义⼀个创建对象的接⼝,让其⼦类⾃⼰决定实例化哪⼀个⼯⼚类,⼯⼚模式使其创建过程延迟到⼦类进⾏。 |
2 | 抽象⼯⼚ | Abstract Factory | 替换Redis双集群升级,代理类抽象场景 | 提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽽⽆需指定它们具体的类。 |
3 | 生成器 | Builder | 各项装修物料组合套餐选配场景 | 将⼀个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 |
4 | 原型 | Prototype | 上机考试多套试,每⼈题⽬和答案乱序排列场景 | ⽤原型实例指定创建对象的种类,并且通过拷⻉这些原型创建新的对象。 |
5 | 单例 | Singleton | 7种单例模式案例, Effective Java作者推荐枚举单例模式 | 保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点。 |
结构型模式 Structural Patterns
这类模式介绍如何将对象和类组装成较⼤的结构, 并同时保持结构的灵活和⾼效。
序号 | 类型 | English Name | 业务场景 | 实现要点 |
6 | 适配器 | Adapter | 从多个MQ消息体中,抽取指定字段值场景 | 将⼀个类的接⼝转换成客户希望的另外⼀个接⼝。适配器模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作。 |
7 | 桥接 | Bridge | 多⽀付渠道(微信、⽀付宝)与多⽀付模式(刷脸、指纹)场景 | 将抽象部分与实现部分分离,使它们都可以独⽴的变化。 |
8 | 组合 | Composite | 营销差异化⼈群发券,决策树引擎搭建场景 | 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得⽤户对单个对象和组合对象的使⽤具有⼀致性。 |
9 | 装饰 | Decorator | SSO单点登录功能扩展,增加拦截⽤户访问⽅法范围场景 | 动态地给⼀个对象添加⼀些额外的职责。就增加功能来说,装饰器模式相⽐⽣成⼦类更为灵活。 |
10 | ⻔⾯ | Facade | 基于SpringBoot开发⻔⾯模式中间件,统⼀控制接⼝⽩名单场景 | 为⼦系统中的⼀组接⼝提供⼀个⼀致的界⾯,⻔⾯模式定义了⼀个⾼层接⼝,这个接⼝使得这⼀⼦系统更加容易使⽤。 |
11 | 享元 | Flyweight | 基于Redis秒杀,提供活动与库存信息查询场景 | 运⽤共享技术有效地⽀持⼤量细粒度的对象。 |
12 | 代理 | Proxy | 模拟mybatis-spring中定义DAO接⼝,使⽤代理类⽅式操作数据库原理实现场景 | 为其他对象提供⼀种代理以控制对这个对象的访问。 |
⾏为模式 Behavioral Patterns
这类模式负责对象间的高效沟通和职责委派。
序号 | 类型 | English Name | 业务场景 | 实现要点 |
13 | 责任链 | Chain of Responsibility | 模拟618电商⼤促期间,项⽬上线流程多级负责⼈审批场景 | 避免请求发送者与接收者耦合在⼀起,让多个对象都有可能接收请求,将这些对象连接成⼀条链,并且沿着这条链传递请求,直到有对象处理它为⽌。 |
14 | 命令 | Command | 模拟⾼档餐厅⼋⼤菜系,⼩⼆点单厨师烹饪场景 | 将⼀个请求封装成⼀个对象,从⽽使您可以⽤不同的请求对客户进⾏参数化。 |
15 | 迭代器 | Iterator | 模拟公司组织架构树结构关系,深度迭代遍历⼈员信息输出场景 | 提供⼀种⽅法顺序访问⼀个聚合对象中各个元素, ⽽⼜⽆须暴露该对象的内部表示。 |
16 | 中介 | Mediator | 按照Mybatis原理⼿写ORM框架,给JDBC⽅式操作数据库增加中介者场景 | ⽤⼀个中介对象来封装⼀系列的对象交互,中介者使各对象不需要显式地相互引⽤,从⽽使其耦合松散,⽽且可以独⽴地改变它们之间的交互。 |
17 | 备忘录 | Memento | 模拟互联⽹系统上线过程中,配置⽂件回滚场景 | 在不破坏封装性的前提下,捕获⼀个对象的内部状态,并在该对象之外保存这个状态。 |
18 | 观察者 | Observer | 模拟类似⼩客⻋指标摇号过程,监听消息通知⽤户中签场景 | 定义对象间的⼀种⼀对多的依赖关系,当⼀个对象的状态发⽣改变时,所有依赖于它的对象都得到通知并被⾃动更新。 |
19 | 状态 | State | 模拟系统营销活动,状态流程审核发布上线场景 | 允许对象在内部状态发⽣改变时改变它的⾏为,对象看起来好像修改了它的类。 |
20 | 策略 | Strategy | 模拟多种营销类型优惠券,折扣⾦额计算策略场景 | 定义⼀系列的算法,把它们⼀个个封装起来,并且使它们可相互替换。 |
21 | 模板方法 | Template Method | 模拟爬⾍各类电商商品,⽣成营销推⼴海报场景 | 定义⼀个操作中的算法的⻣架,⽽将⼀些步骤延迟到⼦类中。模板⽅法使得⼦类可以不改变⼀个算法的结构即可᯿定义该算法的某些特定步骤。 |
22 | 访问者 | Visitor | 模拟家⻓与校⻓,对学⽣和⽼师的不同视⻆信息的访问场景 | 主要将数据结构与数据操作分离。 |