Design patterns 状态模式:为什么';上下文类是否实现或继承状态抽象接口/类?

Design patterns 状态模式:为什么';上下文类是否实现或继承状态抽象接口/类?,design-patterns,state-pattern,Design Patterns,State Pattern,我正在读关于国家模式的书。我才刚刚开始,所以我当然是从阅读全文开始的 我注意到本文中的两个示例都有一些基本抽象类或Java接口,用于泛型状态的方法/函数。还有一些状态继承自基,并以不同的方式实现这些方法/函数。然后是一个上下文类,它有一个State类型的私有成员,并且在任何时候都可以等于其中一个实现的实例。该上下文类还实现了相同的方法,并将它们传递到当前状态实例,然后有一个额外的方法来更改状态(或者根据设计,我理解状态的更改可能是对其中一个已实现方法的反应) 为什么该上下文类不专门“扩展”或“实

我正在读关于国家模式的书。我才刚刚开始,所以我当然是从阅读全文开始的

我注意到本文中的两个示例都有一些基本抽象类或Java接口,用于泛型状态的方法/函数。还有一些状态继承自基,并以不同的方式实现这些方法/函数。然后是一个上下文类,它有一个State类型的私有成员,并且在任何时候都可以等于其中一个实现的实例。该上下文类还实现了相同的方法,并将它们传递到当前状态实例,然后有一个额外的方法来更改状态(或者根据设计,我理解状态的更改可能是对其中一个已实现方法的反应)


为什么该上下文类不专门“扩展”或“实现”通用状态基类/接口?

因为状态是一个实现细节,而不是其接口的一部分。也就是说,上下文不是一个状态,它只有一个状态。上下文的用户甚至不需要知道它有一个状态。

根据GOF,它字面上说:

'上下文可以将自身作为参数传递给处理请求的状态对象。这允许状态对象在必要时访问上下文”

查看他们的TCPConnection/TCPState示例,TCPState包含对TCPConnection的具体引用

因此,随着抽象程度的提高,具体状态可以保存对具体状态上下文对象的引用,以设置新状态。然而,我也看到Subject/Observer用于状态更新,而不是StateContext->setState(state)


我还看到人们使用StateContext为特定于域的接口实现状态接口。

听起来不错。这纯粹是概念性的。当然是有道理的,我也有这种感觉,但我想我只是需要从别人那里听到而已@Ricket,还有一点需要注意:虽然Wikipedia示例显示上下文与State具有相同的接口,但我认为这不是模式的固有部分-接口可能略有不同,甚至完全不同。@Ricket,还有一个实际的好处,
上下文
接口可以比
状态
接口更简单(如State/StateContext示例中所示)。