|
|
@ -4,7 +4,7 @@
|
|
|
|
> <br>
|
|
|
|
> <br>
|
|
|
|
> commit b18f90970ab7223ee8af18ef466a5ba6ff8482ef
|
|
|
|
> commit b18f90970ab7223ee8af18ef466a5ba6ff8482ef
|
|
|
|
|
|
|
|
|
|
|
|
**状态模式**(*state pattern*)是一个面向对象设计模式。改模式的关键在于一个值有某些内部状态,体现为一系列的 **状态对象**,同时值的行为随着其内部状态而改变。状态对象共享功能 ———— 当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象代表负责其自身的行为和当需要改变为另一个状态时的规则的状态。持有任何一个这种状态对象的值对于不同状态的行为以及何时状态转移毫不知情。
|
|
|
|
**状态模式**(*state pattern*)是一个面向对象设计模式。该模式的关键在于一个值有某些内部状态,体现为一系列的 **状态对象**,同时值的行为随着其内部状态而改变。状态对象共享功能 —— 当然,在 Rust 中使用结构体和 trait 而不是对象和继承。每一个状态对象代表负责其自身的行为和当需要改变为另一个状态时的规则的状态。持有任何一个这种状态对象的值对于不同状态的行为以及何时状态转移毫不知情。
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Below -- requirements for what, for what we need the value for? -->
|
|
|
|
<!-- Below -- requirements for what, for what we need the value for? -->
|
|
|
|
<!-- I've clarified /Carol -->
|
|
|
|
<!-- I've clarified /Carol -->
|
|
|
@ -58,11 +58,11 @@ line, not sure if that's accurate though -->
|
|
|
|
<!-- Yes, the state pattern will be implemented within the `Post` type. I've
|
|
|
|
<!-- Yes, the state pattern will be implemented within the `Post` type. I've
|
|
|
|
tweaked the wording a bit but you've pretty much got it! /Carol-->
|
|
|
|
tweaked the wording a bit but you've pretty much got it! /Carol-->
|
|
|
|
|
|
|
|
|
|
|
|
注意我们与 crate 交互的唯一的类型是 `Post`。这个类型会使用状态模式并会存放处于三种博文所可能的状态之一的值 ———— 草案,等待审核和发布。状态上的改变由 `Post` 类型内部进行管理。状态依库用户对 `Post` 实例调用的方法而改变,但是不能直接管理状态变化。这也意味着用户不会在状态上犯错,比如在过审前发布博文。
|
|
|
|
注意我们与 crate 交互的唯一的类型是 `Post`。这个类型会使用状态模式并会存放处于三种博文所可能的状态之一的值 —— 草案,等待审核和发布。状态上的改变由 `Post` 类型内部进行管理。状态依库用户对 `Post` 实例调用的方法而改变,但是不能直接管理状态变化。这也意味着用户不会在状态上犯错,比如在过审前发布博文。
|
|
|
|
|
|
|
|
|
|
|
|
### 定义 `Post` 并新建一个草案状态的实例
|
|
|
|
### 定义 `Post` 并新建一个草案状态的实例
|
|
|
|
|
|
|
|
|
|
|
|
让我们开始实现这个库吧!我们知道需要一个公有 `Post` 结构体来存放一些文本,所以让我们从结构体的定义和一个创建 `Post` 实例的公有关联函数 `new` 开始,如示例 17-12 所示。还需定义一个私有 trait `State`。`Post` 将在私有字段 `state` 中存放一个 `Option` 中的 trait 对象 `Box<State>`。稍后将会看到为何 `Option` 是必须的。
|
|
|
|
让我们开始实现这个库吧!我们知道需要一个公有 `Post` 结构体来存放一些文本,所以让我们从结构体的定义和一个创建 `Post` 实例的公有关联函数 `new` 开始,如示例 17-12 所示。还需定义一个私有 trait `State`。`Post` 将在私有字段 `state` 中存放一个 `Option` 类型的 trait 对象 `Box<State>`。稍后将会看到为何 `Option` 是必须的。
|
|
|
|
|
|
|
|
|
|
|
|
`State` trait 定义了所有不同状态的博文所共享的行为,同时 `Draft`、`PendingReview` 和 `Published` 状态都会实现 `State` 状态。现在这个 trait 并没有任何方法,同时开始将只定义 `Draft` 状态因为这是我们希望博文的初始状态:
|
|
|
|
`State` trait 定义了所有不同状态的博文所共享的行为,同时 `Draft`、`PendingReview` 和 `Published` 状态都会实现 `State` 状态。现在这个 trait 并没有任何方法,同时开始将只定义 `Draft` 状态因为这是我们希望博文的初始状态:
|
|
|
|
|
|
|
|
|
|
|
|