awesome-patterns/behavioral/state/main.go
2019-05-03 10:48:46 +08:00

85 lines
1.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 状态模式 state pattern.
// 与策略模式在一些场景可以通用,但策略模式倾向于调用者根据情况手动改变内部策略以切换算法,
// 状态模式倾向于由Context内部自行管理状态只需要设定初始状态即可不需要手动切换.
//
// 以下是以跷跷板seesaw为例分为[左侧高LeftState|右侧高RightState]
package main
import (
"math/rand"
"time"
)
// state
type SeesawState interface {
LiftLeftSide(S *Seesaw)
LiftRightSide(S *Seesaw)
}
type LeftState struct {}
func (LeftState) LiftLeftSide(S *Seesaw) {
println("↑LEFT > left side wads already lifted")
}
func (l LeftState) LiftRightSide(S *Seesaw) {
println("RIGHT↑ > lift right side")
S.State = RightState{}
}
type RightState struct {}
func (r RightState) LiftLeftSide(S *Seesaw) {
println("↑LEFT > lift left side")
S.State = LeftState{}
}
func (RightState) LiftRightSide(S *Seesaw) {
println("RIGHT↑ > right side wads already lifted")
}
// context
type Seesaw struct {
State SeesawState
}
func (s *Seesaw)MakeLeftUp(){
s.State.LiftLeftSide(s)
}
func (s *Seesaw)MakeRightUp(){
s.State.LiftRightSide(s)
}
func main(){
// init left
seesaw := &Seesaw{
State:LeftState{},
}
rand.Seed(time.Now().UnixNano())
for i:=0 ;i<10 ;i++{
if rand.Intn(2) == 1{
// ▄▃▂
seesaw.MakeLeftUp()
}else{
// ▂▃▄
seesaw.MakeRightUp()
}
}
/*
output:
RIGHT↑ > lift right side
RIGHT↑ > right side wads already lifted
RIGHT↑ > right side wads already lifted
↑LEFT > lift left side
↑LEFT > left side wads already lifted
↑LEFT > left side wads already lifted
↑LEFT > left side wads already lifted
RIGHT↑ > lift right side
RIGHT↑ > right side wads already lifted
↑LEFT > lift left side
*/
}