设计模式目前已变成了软件工程中的一种沟通语言,尤其是当涉及如Java等对函数式编程支持相对较差的语言时。 个人认为设计模式最大的贡献是给软件设计中的常见代码模式赋予了比较形象的名字,进而促进了程序员之间沟通。 本文接下来将简要介绍设计模式,希望能对大家有所帮助。
1. 设计模式
设计模式一个有23个,可以分为三类,包括11个行为型模式、5个创建型模式和7个结构型模式。
1.1. 行为型模式
个人认为,大部分行为型模式的主要功能为描述了如何使用面向对象编程(Java等对函数式编程支持相对较差)来模拟部分函数式编程特性,如下:
模式 | 功能简介 |
Interpreter | 代码解释器,本质上属于编译器领域 |
Memento | 对象序列化 |
Mediator | 新增中间层来解耦网状交互 |
State | 状态机,将一堆if-else内容提出来作为多个函数 |
Command | 成员函数指针 |
Strategy | 算法的functor入参 |
Template Method | OOP版Strategy, 以虚函数实现回调, 回调模板 |
Chain of Responsibility | (Filter/Interceptor) 函数指针列表,必须串行执行 |
Observer | 消息队列, 形式上类似于责任链,可以并发执行 |
Visitor | 用面向对象的方法模拟函数式编程以解决expression problem新增列的问题 |
Iterator | 可以看作Visitor特例,解耦容器和算法, 实现方法为提取容器公有接口 |
1.2. 创建型模式
个人认为,大部分创建型模式的功能都是对多参数构造函数的形式进行花样变化,进而提高代码可读性,如下:
模式 | 功能简介 |
Factory Method | 避免client代码强依赖某个类的CTOR签名 |
Abstract Factory | 给不同场景提供不同的factory实现 |
Builder | 多阶段CTOR, CTOR版责任链 |
Prototype | Copy CTOR |
Singleton | 单例 |
1.3. 结构型模式
结构型模式的功能简介如下:
模式 | 功能简介 |
Adapter/Wrapper | STL adaptor |
Proxy | wrap自己接口的adaptor, 功能增强切面,如智能指针/RPC stub |
Decorator | XXX(Input/Output)Stream, 本质上为adaptor, 分阶段添加新特性(继承版的责任链/builder),避免多特性组合导致子类数量几何增长 |
Bridge | 将继承替换为组合,以避免概念组合导致子类数量几何增长 |
Composite | 树形结构,tree root node和subtree node具有相同接口 |
Facade | 类似于mediator, 新增中间层来将多个子系统API包装为一个客户需要的功能,业务开发本质上就是组合多家API来提供客户想要的facade |
Flyweight | 带cache的factory |
2. 参考文档
- 解密“设计模式”
- https://en.wikipedia.org/wiki/Software_design_pattern
- A Little Java, A Few Patterns