go设计模式之状态模式浅谈

go_hiro · · 1224 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

### 概念 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类 ### 何时使用 当一个任务,存在大量与状态有关的条件语句,并且每种条件下,需要执行不同的逻辑时 ### 状态模式的组成 ``` Status:状态 用于抽象状态行为类的行为 Context:状态环境 维护Status状态的切换,实现不同状态下,对外展示不同行为 StatusObj:状态行为类 实现Status接口的行为 ``` 下面以工作日,和休息日两种不同的状态下,Do方法产生不同行为为例说明 ### 1.定义Status接口 ```go //接口定义了各种不同状态下的行为方法 type Status interface { Do() } ``` ### 2.定义StatusObj 分别定义工作日,休息日结构,并且实现Status ```go //定义工作日结构体,并实现Status type Workday struct{} func (*Workday) Do() { fmt.Println("努力工作") } //定义休息日结构体,并实现Status type Offday struct{} func (*Offday) Do() { fmt.Println("快乐生活") } ``` ### 3.定义Context ```go //定义Context,内部嵌套了Status type Context struct { Status } //定义方法SetStatus用于状态切换 func (c *Context) SetStatus(status Status) { c.Status = status } ``` ### 4.使用如下 ```go context := Context{ &Workday{}, } context.Do() //打印出努力工作 context.SetStatus(&Offday{})//切换为休息日状态 context.Do() //打印出快乐生活 context.SetStatus(&Workday{})//再切换为工作日状态 context.Do() //打印出努力工作 ```

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

1224 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传