以电灯开关为例
package main
// 以电灯开关为例
// 定义了机器的状态接口字段
// 又定义了 ON和OFF 2种状态
// 初始状态为ON
//2022/01/22 12:49:15 设备已经开启 ... // 第一次调用ON,初始状态为ON,所以打印当前状态,
//2022/01/22 12:49:15 从On状态到Off // 第一次调用Off,当前状态为On,打印状态转换提示,并将状态设置为OFF
//2022/01/22 12:49:15 设备已关闭 ... // 第二次调用Off,当前状态为Off,故打印当前状态
//2022/01/22 12:49:15 从Off状态到On // 第二次调用On,当前状态为Off,所以打印状态转换提示,并设置状态为On
import "log"
type State interface {
On(m *Machine)
Off(m *Machine)
}
// 机器
type Machine struct {
current State
}
func NewMachine() *Machine {
return &Machine{NewOn()}
}
func (m *Machine) setCurrent(s State) {
m.current = s
}
func (m *Machine) On() {
m.current.On(m)
}
func (m *Machine) Off() {
m.current.Off(m)
}
// ON 状态
type ON struct {
}
func NewOn() State {
return &ON{}
}
func (s *ON) On(m *Machine) {
log.Println("设备已经开启 ...")
}
func (s *ON) Off(m *Machine) {
log.Println("从On状态到Off")
m.setCurrent(NewOff())
}
// OFF 状态
type OFF struct {
}
func NewOff() State {
return &OFF{}
}
func (s *OFF) On(m *Machine) {
log.Println("从Off状态到On")
m.setCurrent(NewOn())
}
func (s *OFF) Off(m *Machine) {
log.Println("设备已关闭 ...")
}
func main() {
machine := NewMachine()
machine.On()
machine.Off()
machine.Off()
machine.On()
}
发表回复