• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

设计模式go语言实现----状态模式State

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1 定义

状态模式(State): 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

模式动机:
当控制一个对象状态转换的条件表达式过于复杂时,将状态的判断逻辑转移道表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

UML类图:

状态模式包含如下几个角色:

  • Context(环境类):维护一个ConcreteState子类的实例,这个实例定义当前的状态
  • State(抽象状态类):定义一个接口以封装与Context的一个特定状态相关的行为
  • ConcreteState(具体状态类):每一个子类实现一个与Context的一个状态相关的行为

下面以我们工作的状态(随着时间的变化,我们的工装状态是会不断变化的)为例,其UML类图如下:

2 go语言实现

2.1 实现Current

type Work struct {
	hour    int
	current State
	finish  bool
}

func (w *Work) SetState(s State) {
	w.current = s
}

func (w *Work) SetHour(hour int) {
	w.hour = hour
}

func (w *Work) SetFinishState(finish bool) {
	w.finish = finish
}

func (w Work) WriteProgram() {
	w.current.WriteProgram(w)
}

2.2 实现State与ConcreteState

type State interface {
	WriteProgram(work Work)
}

type ForenoonState struct{}

func (fs ForenoonState) WriteProgram(work Work) {
	if work.hour < 12 {
		fmt.Println("上午")
	} else {
		work.SetState(NoonState{})
		work.WriteProgram()
	}
}

type NoonState struct{}

func (ns NoonState) WriteProgram(work Work) {
	if work.hour < 13 {
		fmt.Println("中午")
	} else {
		work.SetState(AfternoonState{})
		work.WriteProgram()
	}
}

type AfternoonState struct{}

func (as AfternoonState) WriteProgram(work Work) {
	if work.hour < 17 {
		fmt.Println("下午")
	} else {
		work.SetState(EveningState{})
		work.WriteProgram()
	}
}

type EveningState struct{}

func (es EveningState) WriteProgram(work Work) {
	if work.finish {
		work.SetState(RestState{})
		work.WriteProgram()
	} else {
		if work.hour < 21 {
			fmt.Println("晚间")
		} else {
			work.SetState(SleepingState{})
			work.WriteProgram()
		}
	}
}

type SleepingState struct{}

func (ss SleepingState) WriteProgram(work Work) {
	fmt.Println("睡着了")
}

type RestState struct{}

func (rs RestState) WriteProgram(work Work) {
	fmt.Println("下班回家")
}

2.3 客户端调用

func main() {
	tWork := state.Work{}
	tState := state.ForenoonState{}
	tWork.SetState(tState)
	tWork.SetFinishState(true)
	tWork.SetHour(22)
	tWork.WriteProgram()
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
6.使用Go向Consul注册的基本方法发布时间:2022-07-10
下一篇:
GO语言(一)G语言自虐发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap