golang简明教程 golang怎么运行
OrderContext 是订单上下文,包含当前状态和订单数据:
准备好学习“go 语言免费学习笔记(可件)”;type OrderContext struct { State OrderState ID string // 其他订单信息}func (o *OrderContext) Pay() { o.State.Pay(o)}func (o *OrderContext) Ship() { o.State.Ship(o)}func (o *OrderContext) Complete() { o.State.Complete(o)} 登录后,复制特定状态的实现
每个状态都实现了 OrderState 接口,并根据业务逻辑确定该状态是否允许转移。
type PendingPaymentState struct{}func (s *PendingPaymentState) Pay(ctx *OrderContext) { fmt.Println(quot;电影quot;成功, ctx.ID, quot;政电quot;) ctx.State = amp;PaidState{}}func (s *PendingPaymentState) Ship(ctx *OrderContext) { fmt.Println(quot;支持未支件,不是付款quot;)}func (s *PendingPaymentState) Complete(ctx *OrderContext) { fmt.Println(quot;电影未付款,不是全线quot;)}复制后登录
类似地,实现已付款状态:Remove.bg
AI在线抠图软件,图片最好天球 174 查看详情 type PaidState struct{}func (s *PaidState) Pay(ctx *OrderContext) { fmt.Println(quot;paidState 尚未准备好付款;)}func (s *PaidState) Ship(ctx *OrderContext) { fmt.Println(";shippedState";, ctx.ID, ";已发货";) ctx.State = amp;ShippedState{}}func (s *PaidState) Complete(ctx *OrderContext) { fmt.Println(";请先发货再再最了分货";)} 登录后,可以更改状态字段的状态,实现状态转换。调用者无需知道当前状态,只需调用方法,其行为由具体状态决定。
使用示例:order := amp;OrderContext{ State: amp;PendingPaymentState{},ID: quot;1001quot;,}order.Pay() // 输出: 电影 1001 政用手机order.Ship() // 输出: 电影 1001 已发货order.Complete()// 输出: 电影 1001
这种设计将逻辑状态分配到相应的类型中。添加新状态时,只需添加新的结构并实现接口,不会影响原有代码。提示和注意事项
实现状态模式时,请注意以下几点以提高代码质量:避免状态间的强耦合:不要在状态之间直接引用彼此的类型,通过工厂函数或上下文方法创建新状态,减少依赖性。考虑状态的数据初始化:如果状态需要额外的数据(例如超时时间),可以在状态结构中定义字段,并在上下文中传递。结合 Option Context 配置模式:复杂上下文可用 Option 模式初始化,增加灵活性。
基本上就是这样。虽然 Golang 没有传统的面向对象语法,但通过接口和组合,它也可以编写清晰、可扩展的状态管理模式。关键在于实现“行为随状态变化”的核心思想。switch golang if switch 面向对象封装结构继承接口委托对象我们都在这里:Golang 高效 HTTP GET 请求参数综合指南。
