Skip to content
← 返回设计模式列表
设计意图与对象责任

状态 ​

根据当前状态切换行为。

行为型

说明 ​

状态增多且转换规则复杂时,把各状态行为放在独立类型中。

分析 ​

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())
}

继续阅读