设计模式 行为型模式

141 阅读4分钟

是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

主要有11种:

责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

责任链模式

构建方式

  • 接收对象有不同的种类
  • 对于接收对象用统一的责任链处理
  • 在责任链上包含多个接收者,不同的接收者可以处理不同的接收对象
  • 当前接收者无法处理当前接受当前接收对象时,传递给下一个接收者

比如可以用于不同级别的日志打印

  • 调用方不需要知道接收者内部如何针对接收对象做不同处理,同时接收者内部可以解耦不同的处理逻辑
    • 调用方与责任链解耦
  • 接收者内部可以更加灵活对应不同的处理逻辑

命令模式

数据驱动设计模式

  • 调用方将命令包裹成对象
    • 需要抽象命令
  • 传递给接收者
  • 接收者执行命令

相比责任链模式,感觉责任链模式执行逻辑嵌入接收者命令模式每个命令自带执行逻辑,接收者只是调用命令的执行函数,并且命令模式可以添加多个命令后串行执行多个命令

解释器模式

对于一些语法、表达式上的操作,可以通过类方法的方式代替直接写文本

如sql表达式可以用gorm中的一系列函数替代

迭代器模式

看到这个名字,其实就蛮熟悉的了,在python种也有迭代器的概念

  • 集合对象实现迭代器集合抽象方法(getIterator)
    • 使得对象可用于for range语言特性,进行遍历
  • 集合对象返回的迭代器需实现迭代器抽象(hasNext、getNext)

中介者模式

  • 通过一个中介者类处理维护多个类、对象之间的通信交互
  • 由类似的网络结构变成中心化结构(星型结构)
  • 可以降低类与类之间的耦合
    • 防止出现类似一个类代码修改,与之通信交互的其他类代码也必修改的惊群效应
    • 避免出现职责、引用混乱

备忘录模式

保存对象的某个状态,调用者可以在适当的时候获取该状态

观察者模式

当多个对象状态依赖一个对象a状态的时候,a对象状态发生变化,依赖a的对象状态也会发生变化

  • 观察者模式在a发生状态变化的时候,会自动通知依赖a的对象,然后进行更新
  • 一般采用异步的方式通知所有被通知者

需要注意,如果被通知者也是被观察者,可能会出现循环通知的情况

  • 被通知对象初始化的时候会调用attach,告诉对象a自己需要被更新
  • 当a变化时,setState会调用所有attach进来的对象的update方法

状态模式

对象行为由其状态决定

  • 状态也有对应抽象

将行为设置在状态内,不同的状态内部行为不一样

  • 不同状态都需要实现状态抽象的行为function

状态可以一直附在上下文(contexcontext)中,持续传递

  • 上下文拥有设置状态、获取状态的函数

策略模式

根据传进来的上下文context,不同条件下返回实现了算法抽象的不同算法类,从而采用不同的策略

模板模式

感觉就是抽象。。。

抽象中定义了该类的主要流程(内部方法的调用顺序等)以及内部有哪些方法(构成了刚刚的主要流程)

实现可以按需实现内部方法,从而使得经过主要流程后可到达不同目的

访问者模式

元素集合类内部包含了很多元素(底层有元素抽象)

  • 元素集合类在初始化的时候需要一个访问者类
  • 不同的访问这类针对元素的处理方式不一样
    • 可以根据需要灵活地实现访问者类来改变元素的执行算法‘
    • 访问者类依赖元素类的抽象方法