状态(state)模式在实现上类似于策略模式,但是它们的目标非常的不同。状态模式呈现的是一个状态转换系统:系统中的对象处在一个特定的状态当中,经过某些操作之后可以抵达另外的状态。
为了实现这一目标,需要一个状态管理器manager,或者一个上下文context来提供交换状态的接口。在实现上,这个类需要包含一个指向状态的指针,每个状态需要知道下一个状态是什么,并且在触发之后达到哪种状态。
状态设计模式主要包含状态管理器以及多种状态两中设计类。管理器维护当前状态,推动操作然后抵达目标状态。而状态类相对于调用者来说是个黑箱,需要内部进行自管理。
一个状态模式的例子
为了展示状态模式设计,我们构建一个XML的分析工具。上下文管理器就是分析工具本身。参数是文本输入,寻找指定的值然后进入不同的状态进行操作,最终目标是创建每个标签(Tag)节点的对象树。为了能够完成任务,我们需要对XML的Tag进行分析。为了简化,我们不处理Tag的属性,以及Tag嵌套在Tag内容中的情形,下面是一个用于分析的XML文件:
Kelvin Gao
Packet Publishing
Python3 Programming1
Object Oriented Design2
Objects In Python我们先来看一下程序的输出是什么,目标是输出一个节点对象树,节点到底什么样呢?我们需要Tag的名字,一个指向父节点的指针,按顺序排列的子节点列表,注意某些节点有文本内容,而有些没有。下面是设计的节点类:
class Node:
def __init__(self, tag_name