《设计模式之美》笔记:设计模式-行为型

清单

模式 概要 什么时候选用 注意 实操
观察者 在对象之间定义一个一对多的依赖关系,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知 · 观察者变动较频繁
· 希望借助异步来提高吞吐量
· 同步阻塞
· 异步非阻塞
· 进程内
· 进程间
· 线程池
· 消息队列
模板 在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现,这里的“算法”可以理解为广义上的“业务逻辑” · 复用
· 扩展
- · 继承
· 抽象
策略 定义一簇算法类,将每个算法分别封装起来,让它们可以互相替换 · 概念上属于同类的不同对象,可对外暴露同样的接口,而各自有不同的实现
· 添加新“策略”时可以最小化、集中化代码改动
- · 不同策略实现相同的接口或继承相同的父类
· 工厂类运行时确定选用的“策略”
· 查表法或if-else分支判断
职责链 将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够过处理它为止 · 过滤器
· 拦截器
- · 处理器Filter
· 处理器链FilterChain
状态 状态机的一种实现方式 状态种类不太多,而事件触发的动作比较复杂 - · 每种状态封装成一个类,将事件和动作包在其中
迭代器 用来遍历集合对象 - 遍历的同时增删集合元素,会发生未决行为 · 容器,定义iterator()方法
· 迭代器,定义三个方法:hasNext(), currentItem(), next()
访问者 允许一个或者多个操作应用到一组对象上,解耦操作和对象本身 很少用,不好理解 - 将操作独立出来一个类,对一组不同的对象进行操作
备忘录 在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态 用来防丢、撤销、恢复等 - 对于大对象的备份,可以低频全量备份,高频增量备份
命令模式 将请求(命令)封装为一个对象,这个对象支持被传递,从而能够将请求(命令)做排队、异步执行等操作 用来控制命令的执行,比如异步、延迟、排队、撤销重做等 - 很少用
解释器 为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法 如:翻译器,计算器,自定义接口告警规则等 - 一般做法是,将语法规则拆分成一些小的独立单元,然后对每个单元进行解析,最终合并为整个语法规则的解析
中介 定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互 只有当参与者之间的交互关系错综复杂,维护成本很高的时候,我们才考虑使用中介模式 好处是简化了一组对象之间的交互,坏处是中介类可能会编程大而复杂的“上帝类” 引入中介这个中间层,将一组对象之间的交互关系(或者依赖关系)从多对多(网状关系)转换成一对多(星状关系)
- - - - -




设计模式要干的事情就是解耦

  • 创建型模式是将创建和使用代码解耦
  • 结构型模式是将不同的功能代码解耦
  • 行为型模式是将不同的行为代码解耦
    • 观察者模型,是将观察者和被观察者代码解耦


模板模式

  • 复用
    • 所有子类可以复用父类中提供的模板方法的代码
  • 扩展
    • 框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能


回调

- 简介
    - 回调是一种双向调用关系。A类事先注册某个函数F到B类,A类在调用B类中的P函数的时候,B类反过来调用A类注册给它的F函数。这里的F函数就是“回调函数”。A调用B,B反过来又调用A,这种调用机制就叫做“回调”。
- 同步回调
    - 函数返回之前执行回调函数
    - 像模板模式
        - 从代码实现上来看,回调和模板模式完全不同。回调基于组合关系来实现,把一个对象传递给另一个对象,是一种对象之间的关系;模板模式基于继承关系来实现,子类重写父类的抽象方法,是一种类之间的关系。
- 异步回调
    - 函数返回之后执行回调函数
    - 像观察者模式


策略模式

  • 解耦的是策略的定义、创建、使用三个部分


状态机

  • 三种实现方式
    • 分支逻辑法
      • 利用if-else或者switch-case;对简单状态机来说,这个方式最简单直接。
    • 查表法
      • 对于状态非常多,状态转移比较复杂的状态机,这个方式比较合适;通过二维数组来表示状态转移图,能极大提高代码的可读性和可维护性。
    • 状态模式
      • 对于状态不多,状态转移也比较简单,但事件触发执行的动作包含的业务逻辑可能比较复杂的状态机来说,这个方式是首选。


迭代器模式

  • 遍历集合一般有三种方式:for循环、foreach循环、迭代器遍历;后两种都可以看做迭代器遍历;
  • 迭代器相对for循环的三个优势
    • 迭代器模式封装集合内部的复杂数据结构,开发者不用了解如何遍历,直接使用容器提供的迭代器即可
    • 迭代器模式将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一
    • 迭代器模式让添加新的遍历算法更加容易,更符合开闭原则;另外,因为迭代器都实现自相同的接口,在开发中,基于接口而非实现编程,替换迭代器也更加容易


中介模式 vs 观察者模式

  • 区别
    • 观察者模式
      • 参与者之间的交互比较有条理,一般都是单向的,一个参与者只有一个身份,要么是观察者,要么是被观察者。
    • 中介模式
      • 参与者之间的交互关系错综复杂,既可以是消息的发送者,也可以同时是消息的接收者。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355

推荐阅读更多精彩内容