【发布时间】:2011-08-02 18:08:33
【问题描述】:
我正在通过阅读Head First Design Patterns来学习设计模式,并且我刚刚完成了状态模式这一章。但是,我不明白一件事:
在书中,有状态的类称为Context,而实际的状态实现State接口。当给书一个请求时,使用这里的方法来改变状态:
- 上下文接收请求;
- Context 调用其拥有的 State 上的 handle() 方法,将请求交给 State;
- State 处理请求,如果需要更改,则在 Context 中设置 State。为此,States 将 Context 作为一个字段。
但是,在我看来,这在两个类之间给出了某种“递归”耦合,并且不直观。如果我还没有阅读他们的解决方案,我更喜欢以下设计:
- 上下文接收请求;
- Context 调用其拥有的 State 上的 handle() 方法,将请求交给 State;
- State处理请求,并返回一个State;是否是另一个州取决于请求的处理方式。
- 上下文将自己的状态设置为返回的状态。
我能想到的利弊:
- 如果我们将所有可能变化的内容放入 State 类、Context 和 State 中并变得更加解耦,因为它们不需要窥视彼此的字段;
- State 类可能会变得更大;
- 状态可能不容易在不同的上下文中重用。但是,我们可以将States 实现为实现State 接口的抽象类,并具有由抽象States 子类化的Contexts 使用的具体States。
是否有任何具体原因应该支持第一个(Head First Design Patterns 使用),或者第二个选择也有效并在实践中使用,或者它有一些我没有看到的严重缺陷?
感谢您的所有投入以及您花时间阅读和回复!
【问题讨论】:
标签: design-patterns decoupling state-pattern