浅谈设计模式

设计模式目前已变成了软件工程中的一种沟通语言,尤其是当涉及如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