状态
根据当前状态切换行为。
行为型
说明
状态增多且转换规则复杂时,把各状态行为放在独立类型中。
分析
Draft 与 Published 各自实现状态接口,把状态对应的行为放在所属类型中。调用 Next 得到新状态,调用方无需维护越来越长的状态判断分支。
状态对象封装合法后继。示例 Draft.Next 返回 Published,而 Published.Next 仍返回 Published,因此重复 Next 是自循环,并不会报错。若业务规定已发布后不能再次发布,就必须增加事件与错误契约;仅更换类型不能自动校验权限或并发版本。
查看图表代码
适用前提与边界
转换规则需要集中定义,并保证不允许的转换不会悄悄发生。 交互流程很短且稳定时,直接调用通常更容易理解。
示例输入与调用
go
var current State = Draft{}
fmt.Println(current.Name())
current = current.Next()
fmt.Println(current.Name())运行输出
text
draft
published完整 Go 示例
go
package main
import "fmt"
type State interface {
Next() State
Name() string
}
type Draft struct{}
type Published struct{}
func (Draft) Next() State {
return Published{}
}
func (Draft) Name() string {
return "draft"
}
func (Published) Next() State {
return Published{}
}
func (Published) Name() string {
return "published"
}
func main() {
var current State = Draft{}
fmt.Println(current.Name())
current = current.Next()
fmt.Println(current.Name())
}继续阅读
- 设计意图与对象责任
- 设计意图与对象责任
- 设计意图与对象责任