状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。
使用场景
有限状态机:当对象有限个状态且在不同状态下具有不同行为时,状态模式是理想的选择。例如,一个订单在“待支付”、“已支付”、“已发货”、“已完成”等状态下有不同的行为和属性。
对象的行为取决于其状态:如果对象的行为在运行时会随着其内部状态的改变而改变,那么状态模式是一个很好的选择。比如,在游戏中,一个角色的行为可能会因其状态(例如正常、受伤、死亡)而改变。
避免使用大量的条件语句:状态模式可以避免使用大量的条件语句来检查对象的状态并根据状态执行不同的行为。这样可以使代码更加清晰和易于维护。
状态间的转换规则复杂:当状态之间的转换规则非常复杂时,使用状态模式可以使得代码更加清晰和易于理解。状态模式将状态转换的逻辑集中在具体的状态类中,使得每个状态的转换规则都变得清晰可见。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| package main
import "fmt"
type OrderState interface { handleOrder() }
type NewOrderState struct{}
func (n *NewOrderState) handleOrder() { fmt.Println("新建订单已创建") }
type PaidOrderState struct{}
func (p *PaidOrderState) handleOrder() { fmt.Println("订单已支付") }
type CompletedOrderState struct{}
func (c *CompletedOrderState) handleOrder() { fmt.Println("订单已完成") }
type OrderContext struct { state OrderState }
func NewOrderContext() *OrderContext { return &OrderContext{state: &NewOrderState{}} }
func (oc *OrderContext) SetState(state OrderState) { oc.state = state }
func (oc *OrderContext) ProcessOrder() { oc.state.handleOrder() }
func main() { order := NewOrderContext()
order.ProcessOrder()
order.SetState(&PaidOrderState{}) order.ProcessOrder()
order.SetState(&CompletedOrderState{}) order.ProcessOrder() }
|
结语
状态模式能够帮助我们更好地组织对象的行为,并且使得状态的改变更加灵活和可扩展。通过将每种状态的行为封装在具体的状态类中,状态模式使得代码更加清晰、可维护,并且能够避免大量的条件语句。当对象具有有限个状态且在不同状态下具有不同行为时,考虑使用状态模式是一个很好的选择。