github:https://github.com/zhumengyifang/GolangDesignPatterns

上一篇:https://blog.csdn.net/weixin_40165163/article/details/91127487

状态模式

在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为模式。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变的context对象。

介绍

意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

主要解决:对象的行为依赖于它的状态,并且可以根据它的状态改变而改变它的相关行为。

何时使用:代码中包含大量与对象状态有关的条件语句。

如何解决:将各种具体的状态抽离出来。

关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个过着多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if else等条件选择语句。

优点:

  • 封装了转换规则。
  • 枚举可能的状态,在枚举状态之前需要确定状态种类。
  • 将所有与某个状态有关的行为放到一个类中,并且可以方便低增加新的状态,只需要改变对象状态即可改变对象的行为。
  • 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句语块。
  • 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

缺点:

  • 状态模式的使用必然会增加系统类和对象的个数
  • 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱
  • 状态模式对开闭原则的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需要修改对应类的源代码。

使用场景:行为随状态改变而改变的场景、条件分支语句的代替者

注意事项:在行为受状态约束的时候使用状态模式,而且状态不超过5个。

实现

我们将创建一个State接口来实现了State接口的实体状态类。Context是一个带有某个状态的类。

StatePatternDemo,我们的演示类使用Context和状态对象来演示Context在状态改变时的行为变化。

代码:

package StatePatternimport "fmt"type State interface {DoAction(context *Context)ToString() string
}type StartState struct {
}func (s *StartState) DoAction(context *Context) {fmt.Println("Play is in start state")context.SetState(s)
}func (s *StartState) ToString() string {return "Start State"
}type StopState struct {
}func (s *StopState) DoAction(context *Context) {fmt.Println("Play is in stop state")context.SetState(s)
}func (s *StopState) ToString() string {return "Stop State"
}
package StatePatterntype Context struct {state State
}func (c *Context) Context() {c.state = nil
}func (c *Context) SetState(state State) {c.state = state
}func (c *Context) GetState() State {return c.state
}

测试:

func testStatePattern()  {context:=new(StatePattern.Context)startState:=new(StatePattern.StartState)startState.DoAction(context)fmt.Println(context.GetState().ToString())stopState:=new(StatePattern.StopState)stopState.DoAction(context)fmt.Println(context.GetState().ToString())
}

输出:

Play is in start state
Start State
Play is in stop state
Stop State

下一篇章: https://blog.csdn.net/weixin_40165163/article/details/91128083

Golang状态设计模式(二十)相关推荐

  1. 【白话设计模式二十二】解释器模式(Interpreter)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  2. Golang观察者设计模式(十九)

    github:https://github.com/zhumengyifang/GolangDesignPatterns 上一篇:https://blog.csdn.net/weixin_401651 ...

  3. Java设计模式(二十二):原型设计模式

    1. 应用场景 如果一个对象的创建总是由几种固定组件不同方式组合而成; 如果对象之间仅仅实例属性不同.将不同情况的对象缓存起来,直接克隆使用.也许这比采用传递参数重新 new 一个对象要来的快一些与工 ...

  4. Java设计模式(二十):中介者设计模式

    1.应用场景 世界上存在着各种各样的数据库,不同数据库有各自的应用场景,对于同一份数据,最开始可能使用关系型数据库(如MySQL)进行存储查询,使用Redis作为缓存数据库,当数据量较大时使用MySQ ...

  5. golang 学习(二十六)第三方包的下载和安装

    第三方包的下载和安装 go 第三方包下载网址 https://pkg.go.dev/ 1.go mod int 初始化项目,生成go.mod文件 2.项目中添加需要引入的包 import (" ...

  6. 设计模式(二十二)观察者模式 C++

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于行为型模式. 观察者模式所做的内容就是解耦 应用场景之 ...

  7. golang 学习(二十四)结构体struct 和 json之间的转换

    结构体struct 和 json之间的转换 import ("encoding/json""fmt""math/rand""tes ...

  8. 【白话设计模式二】外观模式(Facade)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  9. (原创)无废话C#设计模式之二十二:总结(针对GOF23)

    无废话C#设计模式之二十二:总结(针对GOF23) 比较 设计模式 常用程度 适用层次 引入时机 结构复杂度 Abstract Factory 比较常用 应用级 设计时 比较复杂 Builder 一般 ...

最新文章

  1. 6年面试经验总结!让设计师提升进公司的能力!
  2. php csv文件的读取,写入,输出下载操作详解
  3. 实践作业4:Web测试实践(小组作业)记录1
  4. 阿里云前端周刊 - 第 14 期
  5. 视频光端机常见问题解决方法
  6. 百度之星大赛启动,聚焦目标检测,总奖池11.2万!
  7. 云架构指挥调度平台技术方案建议书
  8. loop在python中什么意思_在python中使用loop打开多个文件
  9. netflix-hystrix-简例
  10. 面试必备!Kafka 怎么顺序消费?
  11. 老掉牙的ArrayList解析它它它又来了
  12. Winfrom 桌面弹窗拦截 关闭进程简易程序 源代码下载
  13. 罗永浩与王自如的约战,有不少看头
  14. 2021年中国开源优秀人物揭晓
  15. mysql水果销售系统数据库_mysql数据库水果销售系统
  16. 阿里云ECS服务器部署,nginx+node+git
  17. 我们的新书--《我是一只IT小小鸟》
  18. 计算任意年份的2月有多少天
  19. 使用grpc遇到greenlet.error: cannot switch to a different thread解决方法
  20. 轻松查询UPS国际件物流,并筛选某一天签收的所有单号

热门文章

  1. 阿里云突发性能实例t5详解
  2. AndroidStudio离线执行gradlew :app:denpendencies踩坑
  3. 章节5 文件与目录管理
  4. Android上一种用于选择颜色的控件(颜色选择器)
  5. OpenCV第四篇:边缘检测
  6. MySQL(InnoDB剖析):46---事务之(长事务)
  7. linux安装文件rpm与deb,【已解决】CentOS中直接安装rpm或deb文件
  8. EasyClick 原生UI 隐藏启动悬浮按钮
  9. 全网最全解决这idea乱码问题
  10. MySQL(三)-数据类型