2.1 状态

状态是一种行为设计模式。它用于在程序执行期间对象必须根据其状态更改其行为的情况。

状态

该模式由 3 个块组成:

上下文是一个类,其对象应根据状态更改其行为。

状态是每个具体状态必须实现的接口。通过此接口,Context 对象通过将方法调用委托给它来与状态交互。接口应该包含向其行为要改变的对象反馈的方法。

为此,使用了一个事件(模式发布者 - 订阅者)。这是必要的,以便在事件发生时在程序执行期间替换状态对象。可能存在上下文本身定期轮询状态对象以进行转换的情况。

ConcreteState1, ConcreteState2 - 具体状态的类。应包含有关对象可以从当前状态通过的条件和状态的信息。例如,一个对象可以从 ConcreteState1 转到 ConcreteState2 和 ConcreteState3,然后从 ConcreteState2 回到 ConcreteState1,等等。其中之一的对象在创建时必须包含上下文。

例如,您正在编写一个角色可以奔跑、游泳和飞行的游戏。如果你的角色掉进水里,那么限制他在水中的行为是合理的:现在他不能射击,但他仍然有一些动作:向前、向右、向左游等等。

你的角色的状态可以用一个 State 对象来描述,它有可以调用的方法并且会做一些事情。在您的角色进入水中后,您只需更改对其中另一个 State 对象的引用 - 它就会更改其状态。

2.2 策略

策略是一种行为设计模式,用于定义一系列算法、封装每个算法并使它们可以互换。这允许您通过定义适当的类来选择算法。

Strategy 模式允许您更改选定的算法,而不管使用它的客户端对象如何。

战略

策略模式允许您根据上下文使用不同的业务规则或算法。它用于根据系统(或其环境)的当前状态必须在同一位置使用不同算法的情况。

优势:

  • 封装各种算法的实现,系统变得独立于业务规则可能发生的变化;
  • 以一种标准方式调用所有算法;
  • 不使用开关和/或条件语句。

这种模式有点类似于State模式,但是这里强调的不是状态,而是行为。假设您游戏中的角色可以更换武器。然后在更换武器时,您可以简单地更改对描述该武器工作原理的对象的引用。

2.3 模板法

模板方法

抽象类(abstract class)——定义继承者中被替换的抽象操作,以实现算法的步骤;实现定义算法骨架的模板方法。模板方法调用抽象类中定义的替换和其他操作。

具体类(concrete class)——以实现所必需的方式实现被替换的操作。具体类假定算法的不变步骤将在抽象类中执行。

这种模式经常在需要时使用:

  • 单独使用算法的不变部分,将变化部分留给继承人自行决定。
  • 几个类通用代码的本地化和隔离以避免重复。
  • 允许继承者仅在某些地方扩展代码。

是的,这个模式描述了一对的使用:一个抽象类和它的实现。

2.4 责任链

责任链是一种行为设计模式,旨在组织系统中的责任级别。

责任链

建议在以下情况下使用该模板:

  • 在开发的系统中有一组对象可以处理某种类型的消息;
  • 所有消息必须至少由一个系统对象处理;
  • 系统中的消息根据“自己处理或传递给另一个”方案进行处理,即一些消息在接收到它们的级别进行处理,而另一些则转发给另一级别的对象。

2.5 纪念品

Keeper (Memento)是一种行为设计模式,允许您在不违反封装的情况下修复和保存对象的内部状态,以便以后可以将其恢复到此状态。

守护者(纪念品)

Guardian 模式用于以下情况:

  • 有必要保存对象(或部分)状态的快照以供后续恢复;
  • 获取对象状态的直接接口暴露了实现细节并破坏了对象封装。