设计模式这样玩泰简单(Golang版)-状态模式

本文档介绍如何运用状态模式来设计一个支持预览和编辑模式的文档系统。在预览模式下,系统仅支持查阅文档,而在编辑模式下则允许增删改查。状态模式通过将不同模式的操作封装到对应的状态对象中,实现了模式的扩展性。通过切换状态对象,上下文可以在预览和编辑间自由转换,提供了灵活的操作体验。
摘要由CSDN通过智能技术生成

场景

老板:我们现在要开发一个文档系统,支持多种模式,在预览模式下只支持预览操作.编辑模式下,支持增删改查操作,你有什么好的方案
你:好的老板,那就使用状态模式

方案

在这里插入图片描述
状态模式:我们通过状态对象封装了对上下文的动作.用不同的状态对象维护着对上下文对象操作的不同实现,达到可以横向扩展的效果.
在这个例子中,我们把文档系统当成如图所示的上下文,里面维护几个不同的状态,预览状态、编辑状态,再把我们的增删改查的动作封装到这些状态里面,通过上下文对象去使用它们.以后我们如果要扩张其他的模式,增加一个状态即可.
注意,这里要区分跟策略模式的区别,这些状态是维护在上下文内部的,客户端直接操作上下文对象,不会操作到状态对象,状态对象作为上下文的一部分组成而存在.下面,我们看看对这个例子的实现

实现

package main

import "fmt"

type Stage interface {//状态接口
   Add()
   Delete()
   Update()
   Get()
}

type context struct {
   currentState Stage//当前状态
   currentStateIndex int//当前状态索引
   innerStates []Stage//状态列表
}

func (ctx *context) ChangeState() {//切换状态
   fmt.Println("切换状态")
   ctx.currentStateIndex=ctx.currentStateIndex+1
   ctx.currentStateIndex%=len(ctx.innerStates)
   ctx.currentState=ctx.innerStates[ctx.currentStateIndex]
}

func (ctx *context) Work(){//上下文工作
   ctx.currentState.Add()
   ctx.currentState.Delete()
   ctx.currentState.Update()
   ctx.currentState.Get()
}

func Init() *context{//初始化一个上下文
   ctx:=&context{
   	innerStates:[]Stage{&PreviewState{},&EditState{}},
   }
   ctx.currentStateIndex=0
   ctx.currentState=ctx.innerStates[ctx.currentStateIndex]
   return ctx
}

//下面是两个不同状态的实现
type PreviewState struct {
   
}

func (state *PreviewState) Add()  {
   fmt.Println("[预览模式]不支持增加操作")
}

func (state *PreviewState) Delete()  {
   fmt.Println("[预览模式]不支持删除操作")
}

func (state *PreviewState) Update()  {
   fmt.Println("[预览模式]不支持更新操作")
}

func (state *PreviewState) Get()  {
   fmt.Println("[预览模式]查阅文档")
}

type EditState struct {

}

func (state *EditState) Add()  {
   fmt.Println("[编辑模式]增加文档")
}

func (state *EditState) Delete()  {
   fmt.Println("[编辑模式]删除文档")
}

func (state *EditState) Update()  {
   fmt.Println("[编辑模式]更新文档")
}

func (state *EditState) Get()  {
   fmt.Println("[编辑模式]查阅文档")
}


func main(){
   ctx:=Init()
   ctx.Work()
   ctx.ChangeState()
   ctx.Work()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值