2021年时对设计模式的一句话概括
生成模式
- simaple factory 简单工厂:不同参数(配置)决定一个不同产品(相同接口)
- factory method 工厂方法:不同工厂(相同接口)决定一个不同产品(相同接口)
- abstract factory 抽象工厂:不同工厂(相同接口)决定多个有关联的不同产品(相同接口)
- builder 创建者:调用抽象工厂得到一系列产品的过程
- prototype 原型:以Clone接口创建副本
- singleton 单例:全局一个实例
结构模式
- facade 外观:细节不用管,只看明确让看的。外观把系统的一部分按要求展示,适配器是对一个类/接口按要求转换
- adapter 适配器:加个转换头,改成你要的接口
- decorator 装饰器:核心不变,添油加醋,并且使用者知道油和醋。场景:函数hook
- proxy 代理:隔离使用者和实际工作者,使用者只知道代理,实际工作者在黑箱里
- bridge 桥接:把接活儿的和干活儿的分离,接活和干活都有接口,接活儿的用接口使唤干活儿的。用builder或factory配置俩角儿
- composite 组合:通常专用于实现树,叶子和非叶子有相同的接口
- flyweight 享元:名字吓人,其实就是把实例中能共享的属性缓存起来大家公用。要我起名字就叫“飞地”,多形象~
行为模式
- strategy 策略:给相同应用场景的各种算法定义统一接口,把算法执行条件分离出来做为接口入参
- observer 观察者:用来实现1对多的联动,多之间不需要有业务干系但要实现共同的接口。golang用chan实现通知就很observer
- chain of responsibility 责任链:可以用来替代swich/case或if/elif/else;可以控制向后传递或中断处理;通常以链状组织但也可以做成树状
- template method 模板方法:父类搭好框架,子类虚函数override。好比写函数时先写步骤注释再实现各子函数
- iterator 迭代器:把集合遍历方法抽象出来,封装难以言表的遍历策略,不知是先有STL iterator还是先有迭代器模式
- mediator 中介者:做对象间交互的hub,代码中常见的XxxManager抽象出来就是中介者,它对其组合的对象提供数据反馈接口(signal/slot)
- visitor 访问者:把数据和读操作分离,类比PO和DAO,适合PO稳定DAO虽业务多变时使用
- command 命令:执行者的接口对调用者隐藏,把执行者封装进命令对象,给调用者。类比:不同游戏可以使用同一个手柄,手柄是调用者,指令跑、跳是执行者,游戏业务逻辑把指令绑定到手柄上
- memento 备忘录:提供对象属性的导出/导入接口
- state 状态:指定推演逻辑的策略模式,可以用来替代swich/case或if/elif/else
- interpreter 解释器:自定义语法然后实现语义解释器,怎么看都更像算法而非设计模式