行为型设计模式

简述

  • 行为设计模式的作用是为了定义对象或者类之间的沟通和交流.

责任链模式

  • 特征
    • 每个处理者拥有终止处理链的权利
    • 处理链是有序的
    • 传参可以作为上下文存在
  • 做什么事情
    • 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。
  • 理解
    • 有多个处理者顺序处理某个事情,从这个角度来说(1-n),一个东西需要多个处理者且有序处理
      • 基于这个是有序的,其实可以作为一个流程(流程的步骤存在变动)来进行
        • 各个步骤间不要存在过多的数据依赖/步骤依赖
        • 其实我不太能接受这个模式去定义一个流程
        • 因为各个步骤其实大多有数据依赖/步骤依赖,并不能随意进行替换/调整,容易出错
        • 另一个是因为但是存在数据依赖,却需要通过上下文进行传递.不能体现各个步骤的产出和输入,也不能体现各个步骤的数据依赖
    • 基于每个处理者都拥有终止的权利,经常用作校验功能模块的模式
    • 也可以用作多个处理者只有一个会真正进行处理,这里把选择哪个处理者处理的权利放在一起了
      • 当然也是可以只用来做选择,把各个if分配到执行者当中去
        • 适用于if有优先级
          将请求动态传递给一系列的潜在接收者, 直至其中一名接收者对请求进行处理。
  • 目标
  • 参与者
    • 一个接口(定义一个handle方法/setNext方法)
  • 结构
  • 场景
    • 校验
    • 需要多个顺序执行的处理者(不推荐)
    • 不明确处理者/处理方法的情况,把选择处理的权利和处理的权利执行放在一起的处理者(最终只有一个处理者进行处理)

命令模式

  • 理解
    • 其实就是调用者跟执行者代码分开,然后多增加一个上下文
    • 如果想实现回退的功能呢,那么在执行者增加一个undo行为,上下文需要记录所有的执行者并在需要的时候调用执行者的undo方法
  • 目标
    • 把做事/调用区分开来
    • 用上下文来存放做事记录
  • 参与者
  • 结构
  • 场景
    • 待思考

迭代器模式

  • 目标
    • 提供了访问一些黑箱实体/集合的方式
  • 参与者
  • 结构
  • 场景

中介模式

  • 理解
    • 中介者:加强版的上下文?
      • 这个上下文实际上是拥有各个组件的实例的
      • 这个上下文不止能获取信息,还能指挥其他组件工作
      • 更多地,我们也可以用这个上下文来管理各个组件的生命周期
    • 组件:就是具体的实例(继承同一个父类/实现同一个接口)
      • 其实就是某类东西的各个子类实例
    • 中介者模式,相当于阻隔各个组件间的联系,通过一个中介者(加强版的上下文)进行联系
    • 可以用作各个子类之间的相互联系或者沟通需要通过一个上下文/中介者进行联系
    • 本来各个组件的关系是可能是n-n(多对多),但是使用一个上下文之后就变成n-1(只对一个中介者)
  • 目标
    能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。
  • 参与者
    • 各个组件(需要有传入上下文的方法)
    • 上下文/中介者(需要有注册/传入各个组件的方法)
  • 结构
    • 中介者拥有各个组件实例
    • 各个组件实例拥有上下文/中介者
  • 场景
    • 如果有子类需要调用其他子类进行协同的,可以使用该模式
      • 现实中,我们理解不同子类应该做同一类事情,只是做事方式不同
      • 但是还是可能出现需要相互协作的情况

访问者模式

  • 理解
    • 它能将算法与其所作用的对象隔离开来。(这句话我也理解不了)
    • 如果需要对一组继承体系进行同一个类型操作
      • 除了在这个父类/接口搞一个抽象方法,还能定义一个访问者对象/体系
      • 访问者对象需要与各个子类有关联关系,即需要依赖各个子类
      • 然后再访问者中定义对各个子类的操作
  • 参与者
    • 一个继承体系(需要定义一个accept方法,用以接受访问者对象)
    • 定义一个访问者对象/继承体系(需要定义对上面各个实现类的操作)
  • 结构
  • 场景
    • 当子类各个逻辑都非常简短(你不希望这些逻辑分散到各个子类去)
    • 当有些行为不属于该类对象的时候,你可以搞个访问者体系

备忘录模式

  • 理解
    • 就是对象提供自我复制/自我回复的功能
    • 然后由一个调用者/负责人(caretaker)调用,并存放在历史中
  • 目标
    • 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。
  • 参与者
  • 结构
  • 场景

观察者模式

  • 理解
    • 一个步骤执行后需要执行多个步骤(无顺序/相互之间没有依赖)
  • 目标
  • 参与者
  • 结构
  • 场景

状态模式

  • 理解
    • 这个很容易理解,如果一个对象/行为在不同状态下逻辑不一致,用一个state继承体系来体现出来,然后封装到一个上下文中
    • 不同状态下的执行操作可能会切换到自行切换到另一个状态去
      • 就是子类之间可能存在相互依赖
  • 目标
    • 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。
  • 参与者
  • 结构
  • 场景

策略模式

  • 理解
    • 很简单啦,就是同一件事不同的做法可以直接封装起来,在context进行切换
  • 目标
    • 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。
  • 参与者
  • 结构
  • 场景

模板方法模式

  • 理解
    • 就是把流程中会多样的地方放到子类去实现
    • 原本是一个流程处理(中间有if/else这些东西),然后就变成多个子类了,这个时候就需要进行子类的初始化+选择子类了(这时就需要创建类的模式).
  • 目标
  • 参与者
  • 结构
  • 场景
posted @ 2022-06-03 16:26  躲在墙角的  阅读(56)  评论(0编辑  收藏  举报