设计模式算是软件架构的一种方式,我们需要掌握每种设计模式的应用场景、特征、优缺点,以及相互之间可能存在的关联关系,如此才能合理选择和应用适合当下业务的设计模式。
合理地使用设计模式可以使我们软件的架构更加合理,更加遵循七大设计原则,更加利于代码的扩展和系统的优化,更加地利于理解。
通常情况下,某种设计模式也不是单独使用的,更多地会和其它相关联的模式组合使用。
一、设计模式的分类
1.1 设计原则
在前面的文章中有详细介绍过七大设计原则,如下图所示:

这七大设计原则是所有设计模式都努力遵循的原则,是我们在设计软件结构的时候应该优先考虑的问题。
名称 | 一句话概括 | 作用 |
---|---|---|
开闭原则 | 对扩展开放,对修改关闭 | 提升可扩展性 |
依赖倒置 | 面向接口,依赖接口 | 减少耦合,提升可扩展性 |
单一职责 | 单一职责 | 减少耦合,提升可阅读性 |
接口隔离 | 不使用不需要的功能 | 代码清爽瘦身,可扩展性强 |
迪米特法则 | 最少知识,知道的越少越好 | 减少耦合,提升可阅读性 |
里氏替换 | 父类替换为子类而不改变行为 | 校验继承关系的健康性,不至于让子类乱改父类的内容 |
合成复用 | 多用组合和聚合,少用继承 | 减少耦合,提升可扩展性 |
1.1 创建型
创建型模式总共就只有四种,其中工厂模式和单例模式的实现方式比较多样,需要根据自己业务的特点进行选用。

名称 | 一句话概括 | 作用 |
---|---|---|
工厂模式 | 产品标准化、高效化生产 | 封装创建对象的细节 |
单例模式 | 有且仅有一个类实例 | 保证类实例的唯一性 |
建造者模式 | 自由选择哪些配置,链式添加属性 | 开放个性化地配置对象的属性 |
原型模式 | 高效快速复制对象,基于内存clone对象 | 高效快速复制对象 |

1.2 结构型
结构型模式总共有7种,如下所示:

名称 | 一句话概括 | 作用 |
---|---|---|
适配器模式 | 万能充电头 | 针对已有代码做兼容转换 |
装饰器模式 | 套娃装饰 | 灵活扩展 |
代理模式 | 专业的事情交给专业的人做 | 解耦用户和各式各样的服务 |
门面模式 | 任意门通向任何地方 | 统一服务调用的入口 |
组合模式 | 树状结构统一行为 | 统一整体和个体的行为 |
享元模式 | 对象池复用 | 共享池资源,节省内存 |
桥接模式 | 多维度独立变化 | 减少多维度变化带来的复杂性 |

1.3 行为型
行为型模式比较多,总共有12种,如下所示:

名称 | 一句话概括 | 作用 |
---|---|---|
策略模式 | 选择权交给用户决定 | 减少分支判断 |
状态模式 | 状态驱动行为,行为改变状态,状态机 | 减少分支判断 |
观察者模式 | 被观察者回调通知所有观察者 | 减少主动轮询 |
责任链模式 | 让事情按照流水线一样流动处理 | 单一职责,每个类只要负责自己的事情 |
解释器模式 | 拥有文本符号的解释权 | 实现特定语法的解析 |
模板方法模式 | 父类只定义做事的模板步骤,怎么做需要子类自己摸索 | 逻辑复用,行为标准固定 |
迭代器模式 | 可以迭代任何类型的集合 | 统一对集合的访问方式 |
中介者模式 | 笛卡尔积优化为中心结构 | 解耦各个用户 |
命令模式 | 原子命令组合成命令 | 解耦请求和处理 |
访问者模式 | 管家代理访问者一一拜访所有主人 | 解耦数据的操作和结构 |
委派模式 | 层层外包,不断拆分任务 | 解耦顶层和底层 |
备忘录模式 | 回到过去的后悔药 | 保存过去的状态方便回滚 |

网友评论