2

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

 3 years ago
source link: https://studygolang.com/articles/35025
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

当一个任务,存在大量与状态有关的条件语句,并且每种条件下,需要执行不同的逻辑时

状态模式的组成

Status:状态 用于抽象状态行为类的行为
Context:状态环境 维护Status状态的切换,实现不同状态下,对外展示不同行为
StatusObj:状态行为类 实现Status接口的行为

下面以工作日,和休息日两种不同的状态下,Do方法产生不同行为为例说明

1.定义Status接口

//接口定义了各种不同状态下的行为方法
type Status interface {
    Do()
}

2.定义StatusObj

分别定义工作日,休息日结构,并且实现Status

//定义工作日结构体,并实现Status
type Workday struct{}

func (*Workday) Do() {
    fmt.Println("努力工作")
}

//定义休息日结构体,并实现Status
type Offday struct{}

func (*Offday) Do() {
    fmt.Println("快乐生活")
}

3.定义Context

//定义Context,内部嵌套了Status
type Context struct {
    Status
}
//定义方法SetStatus用于状态切换
func (c *Context) SetStatus(status Status) {
    c.Status = status
}

4.使用如下

context := Context{
    &Workday{},
}
context.Do() //打印出努力工作
context.SetStatus(&Offday{})//切换为休息日状态
context.Do() //打印出快乐生活
context.SetStatus(&Workday{})//再切换为工作日状态
context.Do() //打印出努力工作

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK