### 概念
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
### 何时使用
当一个任务,存在大量与状态有关的条件语句,并且每种条件下,需要执行不同的逻辑时
### 状态模式的组成
```
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() //打印出努力工作
```
有疑问加站长微信联系(非本文作者))