Golang设计模式——14状态模式

简介: Golang设计模式——14状态模式

状态模式

定义

允许一个对象在其内部状态改变时改变它的行为,这个对象看起来就像改变了它的类一样。

优点

  1. 状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。
  2. 减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。
  3. 有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。

缺点

  1. 状态模式的使用必然会增加系统的类与对象的个数。
  2. 状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
  3. 虽然状态模式可以很好的处理行为受状态约束的情况,但相应的对象的状态也会增加,所以在实际项目中使用的时候,要权衡利弊,考虑它对你的设计带来的后果影响是否可以接受。如果状态太多比如十几个或者几十个,还是建议不要使用了。

场景

行为随着状态的改变而改变的时候,这也是状态模式的根本出发点,例如权限设计,人员的状态不同即使执行相同的行为结果也会不同,在这种情况下需要考虑使用状态模式。

条件、分支判断语句的替代者,在程序中大量使用 switch 语句或者if-else判断语句会导致程序结构不清晰,逻辑混乱,使用状态模式可以很好地避免这一问题。

代码

package State
import "fmt"
type Context struct {
  state State
}
func NewContext() *Context {
  return &Context{state: &ConcreteStateA{}}
}
func (c *Context) SetState(state State) {
  c.state = state
}
func (c *Context) Handle() {
  c.state.Handler(c)
}
type State interface {
  Handler(*Context)
}
type ConcreteStateA struct {
}
func (c *ConcreteStateA) Handler(context *Context) {
  fmt.Println("当前状态是A")
  context.SetState(&ConcreteStateB{})
}
type ConcreteStateB struct {
}
func (c *ConcreteStateB) Handler(context *Context) {
  fmt.Println("当前状态是B")
  context.SetState(&ConcreteStateC{})
}
type ConcreteStateC struct {
}
func (c *ConcreteStateC) Handler(context *Context) {
  fmt.Println("当前状态是C")
  context.SetState(&ConcreteStateA{})
}
package State
import "testing"
func TestContext_Handle(t *testing.T) {
  context := NewContext()
  context.Handle()
  context.Handle()
  context.Handle()
  context.Handle()
  context.Handle()
}

其他设计模式

设计模式Git源代码

00简单工厂模式

01工厂方法模式

02抽象工厂模式

03外观模式

04建造者模式

05桥接模式

06命令模式

07迭代器模式

08模板模式

09访问者模式

10备忘录模式

11责任链模式

12中介模式

13原型模式

14状态模式

15策略模式

16享元模式

17组合模式

18解释器模式

19单例模式

20适配器模式

21代理模式

22装饰器模式

23观察者模式


目录
相关文章
|
8月前
|
设计模式
设计模式之 State(状态模式)
设计模式之 State(状态模式)
48 0
|
4月前
|
设计模式 Java 测试技术
Java设计模式-状态模式(18)
Java设计模式-状态模式(18)
|
5月前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
6月前
|
设计模式 JavaScript Go
js设计模式【详解】—— 状态模式
js设计模式【详解】—— 状态模式
100 7
|
7月前
|
设计模式
状态模式-大话设计模式
状态模式-大话设计模式
|
7月前
|
设计模式 存储
行为设计模式之状态模式
行为设计模式之状态模式
|
8月前
|
设计模式 Go
[设计模式 Go实现] 行为型~状态模式
[设计模式 Go实现] 行为型~状态模式
|
8月前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
68 4
|
8月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
8月前
|
设计模式 Java
【设计模式系列笔记】状态模式
在Java中,状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。状态模式的关键思想是将对象的状态封装成独立的类,并将对象的行为委托给当前状态的对象。这样,当对象的状态发生变化时,其行为也会相应地发生变化。
96 0