状态模式

以电灯开关为例

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

已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注