行为型模式

行为型模式

视频链接:https://www.bilibili.com/video/BV15f4y1S77P/

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

模版方法模式

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。

这里写图片描述

模版模式的核心是一个抽象类。抽象类将实现逻辑的骨架定义好,具体实现的抽象方法有继承的子类去实现。


策略模式

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。

这里写图片描述

策略模式与模版模式的区别在于:
在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中。


状态模式

定义:状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

这里写图片描述

简单地说:一个Context对象的状态会发生改变,在他状态发送改变后,若调用request方法,具体的操作是有目前状态的handle方法来操作的,就如同request方法的发生了变化,换种说法,就如同Context对象看上去是改变了类。

状态模式与策略模式有相似之处,都是把具体的处理逻辑抽象封装出来,区别在于:
状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作。


命令模式

定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

这里写图片描述

命令模式的核心在于对命令的封装,即通过将对命令的操作(接受者接口方法的执行顺序等)封装在命令对象的方法中,然后在合适的时间由调用者对象进行调用。调用者Invoker持有一组命令对象的实例。

通过命令对象可以有效降低命令与调用者对于具体操作的耦合,同时可以实现命令的撤销,批量执行等操作。

缺点:过多的简单命令对象创建(几行代码)会造成封装的繁琐。


迭代器模式

定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

这里写图片描述

迭代器与集合是密不可分的,它可以在隐藏集合对象的内部实现的情况下提供一种有效的遍历集合的方式。


备忘录模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。

这里写图片描述

发起人对象的某一瞬时状态可以用备忘录对象保存(可以是发起人对象的全部或部分属性值),备忘录有管理角色管理(管理角色保存一组备忘录对象的实例)。在需要还原的时候,可以通过获取管理角色中所保管的备忘录对象来还原发起人的状态。


观察者模式

定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

这里写图片描述

如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化,这时候最佳的解决方案既是观察者模式。

观察者模式一个重要点是注册于被观察者中的观察者集合。


中介者模式

定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

这里写图片描述

中介者模式是将多个同事类之间的一对多耦合降低成一对一的星状耦合。一般情况下一对多的依赖在程序设计中是允许的,没有必要引用中介这模式。除非在依赖关系过于复杂的情况下,我们才使用中介者降低耦合。


访问者模式

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

这里写图片描述

责任链模式

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

这里写图片描述

责任链模式其实就是一个灵活版的if…else…语句,它就是将这些判定条件的语句放到了各个处理类中。

如果if中的判断过于负载就可以使用责任链。

但是使用责任链时一定要注意链的顺序,以及避免出现死循环的情况。


解释器模式

定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。

这里写图片描述

posted @ 2020-04-18 21:39  李李林  阅读(174)  评论(0)    收藏  举报