设计模式概念
设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
- 定义:描述在软件设计过程中的一些问题以及解决方案
- 重要要素:模式名称(概念)、问题(when)、解决方案(how)、效果(优缺点)、
- 按目的:创建型、结构型、行为型
- 按作用范围:类模式(继承复用、关系在编译时确定)、对象模式(合成复用、关系在运行时确定)
其他要素:别名、动机、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式
设计模式中核心研究对象
设计模式中 核心研究对象 |
层级 | 相当于 | 说明 |
---|---|---|---|
依赖对象 | 底层 | 具体干活的员工 | 简单对象、含有最终实现功能的方法(对修改封闭) |
调用者对象 | 高层 | 老板指挥员工干活 | 复杂对象、调用者通过继承或合成复用,得到底层依赖对象: 1.调用依赖对象的方法,并增强功能(对扩展开放) 2.随意切换依赖对象(LSP、DIP) |
中间人对象 | 中层 | 员工太多的时候 需要聘请经理协助管理员工 |
创建型设计模式(5种)
创建对象
结构型设计模式(7种)
调用者对象,通过继承或合成,持有一个或多个依赖对象,从而调用(复用)这些依赖对象的方法
结构型模式本质:介绍了老板如何招揽若干员工,从而指挥这些员工干活
- 类模式:继承复用
设计模式 | 依赖对象(父类) | 调用者(子类) | 调用者的方法 |
---|---|---|---|
类适配器模式Adapter | Adaptee适配者 | Target接口 ClassAdapter类适配器 |
通过继承,调用父类方法 |
- 对象模式:合成复用
依赖对象的 类型和数量 |
相当于 | 单个依赖 | 多个依赖 | 多个依赖中的每个作为调用者的 |
---|---|---|---|---|
某个具体类依赖 | 特殊事情的临时工 | 对象适配器模式、代理模式 Adapter、Proxy |
外观模式 Facade |
一个属性 |
某个接口依赖 | 特定岗位的员工 | 桥接模式 Bridge |
享元模式 Flyweight (共享结构) |
一个键值对 所有依赖构成HashMap属性 |
自身接口依赖 (调用者接口) |
全能的员工 | 装饰模式 Decorator (链式结构) |
组合模式 Composite (树状结构) |
一个数组元素 所有依赖构成Array属性 |
设计模式 | 依赖对象类 | 调用者类 | 调用者中注入依赖方式及方法 |
---|---|---|---|
对象适配器 | Adaptee适配者 | Target接口 ObjectAdapter对象适配器 |
1.通过构造函数(传参)注入 2.依赖具体类对象, 调用具体类的方法 |
代理 | Subject接口 RealSubject真实主题 |
Subject接口 Proxy代理 |
1.通过构造函数(new)注入 2.依赖具体类对象, 调用并增强具体类的方法 |
外观 | SubSystem子系统 | Facade外观 | 1.通过构造函数(new)注入 2.依赖多种具体类对象, 调用多种具体类对象的多个方法 |
桥接 | Implementor接口 ConcreteImplementor具体实现 |
Abstraction抽象类 RefinedAbstraction扩展抽象 |
1.通过构造函数(传参)注入 2.依赖接口类型对象, 调用并增强接口的方法 |
享元 | Flyweight接口 ConcreteFlyweight具体享元 |
FlyweightFactory享元工厂 | 1.通过普通方法(new)注入 2.依赖某接口类型多个对象HashMap, 将对象从HashMap中获取 若不存在则创建对象, 若存在则直接返回对象 |
装饰 | Component接口 Decorator抽象装饰 |
Decorator类 ConcreteDecorator具体装饰 |
1.通过构造函数(传参)注入 2.依赖自身接口类型对象, 调用并增强接口的方法 |
组合 | Composite接口 Leaf叶子 |
Composite接口 Composite树枝 |
1.通过普通方法(传参)注入 2.依赖自身接口类型多个对象数组, 将对象从数组中添加或移除, 将数组元素的统一看待 |
行为型设计模式(11种)
若干对象协作完成任务
被动执行
策略模式:老板(环境类)挑人(策略类)干活
命令模式:老板(调用者类)挑人(命令类)干活、被人(命令类)转包给第三方(接收者类)做
责任链模式:老板(父类)挑人(子类)干活、被人(子类)踢皮球给别的同事(其他子类)做、可能会一直踢皮球下去直到最终有人干活(链式结构)
解释器模式:老板(环境类)挑人(解释器)干活、被人(子类)踢皮球给多个别的同事(其他子类)做、可能会一直踢皮球下去直到最终有多个人干活(树状结构)
主动推荐
状态模式:给老板(环境类)推荐自己或别的同事(状态类)去干活,老板会让被推荐的人干活
观察者模式:给老板(主题类)推荐自己(观察者类)去干活、老板会让所有人(观察者类)都去干活(主题类)
中介者模式:给老板(中介者类)推荐自己或同事(同事类)去干活,选谁(同事类)还由老板(中介者类)决定
引入经理
迭代器模式:经理(具体聚合类)登记了一堆人(元素)、中间人当有老板(具体迭代器)过来时,会把所有人交给老板(具体迭代器)、老板挑人(元素)干活(策略)
备忘录模式:经理(管理者类)登记了一堆人(备忘录)、中间人当有老板(发起人)过来时,会让某个人(备忘录)推荐给老板,老板让这个人干活(状态)
访问者模式:经理(具体聚合类)登记了一堆人(具体元素类)、中间人当有老板(访问者)过来时,会让所有人(具体元素类)都推荐自己给老板(访问者)、老板会让人这个人干活(状态)
适配器模式:转换方法-springmvc的handlerAdapter
代理模式:为对象提供一个替身-代理远程对象、创建开销大的对象、需要安全控制的对象:静态代理(同一接口)、动态代理(JDK代理、接口代理)、Cglib代理