温州网站制作计划,遵义信息港,苏州网站开发公司济南兴田德润厉害吗,低调与华丽wordpress文章目录 1. 概念1.1 作用1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概念
1.1 作用
状态#xff08;State#xff09;指状态对象#xff0c;用于封装上下文对象的特定状态行为#xff0c;使得上下文对象在内部状态改变时能够改变其自身的行为。
1.1 角色… 文章目录 1. 概念1.1 作用1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1. 概念
1.1 作用
状态State指状态对象用于封装上下文对象的特定状态行为使得上下文对象在内部状态改变时能够改变其自身的行为。
1.1 角色
Context环境类角色内部维护一个当前状态实例并负责具体状态的切换。State抽象状态角色 是所有具体状态的抽象接口它的每一个方法代表了环境类的一种操作 ConcreteState具体状态角色 每个ConcreteState都代表了环境类的一个状态它的每一个方法代表了环境类在该状态下的一种行为环境在不同状态下同一行为的操作是不同的
1.2 类图 #mermaid-svg-l1JxVpgRojAHQn6f {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-l1JxVpgRojAHQn6f .error-icon{fill:#552222;}#mermaid-svg-l1JxVpgRojAHQn6f .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-l1JxVpgRojAHQn6f .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-l1JxVpgRojAHQn6f .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-l1JxVpgRojAHQn6f .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-l1JxVpgRojAHQn6f .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-l1JxVpgRojAHQn6f .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-l1JxVpgRojAHQn6f .marker{fill:#333333;stroke:#333333;}#mermaid-svg-l1JxVpgRojAHQn6f .marker.cross{stroke:#333333;}#mermaid-svg-l1JxVpgRojAHQn6f svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-l1JxVpgRojAHQn6f g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-l1JxVpgRojAHQn6f g.classGroup text .title{font-weight:bolder;}#mermaid-svg-l1JxVpgRojAHQn6f .nodeLabel,#mermaid-svg-l1JxVpgRojAHQn6f .edgeLabel{color:#131300;}#mermaid-svg-l1JxVpgRojAHQn6f .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-l1JxVpgRojAHQn6f .label text{fill:#131300;}#mermaid-svg-l1JxVpgRojAHQn6f .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-l1JxVpgRojAHQn6f .classTitle{font-weight:bolder;}#mermaid-svg-l1JxVpgRojAHQn6f .node rect,#mermaid-svg-l1JxVpgRojAHQn6f .node circle,#mermaid-svg-l1JxVpgRojAHQn6f .node ellipse,#mermaid-svg-l1JxVpgRojAHQn6f .node polygon,#mermaid-svg-l1JxVpgRojAHQn6f .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-l1JxVpgRojAHQn6f .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-l1JxVpgRojAHQn6f g.clickable{cursor:pointer;}#mermaid-svg-l1JxVpgRojAHQn6f g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-l1JxVpgRojAHQn6f g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-l1JxVpgRojAHQn6f .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-l1JxVpgRojAHQn6f .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-l1JxVpgRojAHQn6f .dashed-line{stroke-dasharray:3;}#mermaid-svg-l1JxVpgRojAHQn6f #compositionStart,#mermaid-svg-l1JxVpgRojAHQn6f .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f #compositionEnd,#mermaid-svg-l1JxVpgRojAHQn6f .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f #dependencyStart,#mermaid-svg-l1JxVpgRojAHQn6f .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f #dependencyStart,#mermaid-svg-l1JxVpgRojAHQn6f .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f #extensionStart,#mermaid-svg-l1JxVpgRojAHQn6f .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f #extensionEnd,#mermaid-svg-l1JxVpgRojAHQn6f .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f #aggregationStart,#mermaid-svg-l1JxVpgRojAHQn6f .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f #aggregationEnd,#mermaid-svg-l1JxVpgRojAHQn6f .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-l1JxVpgRojAHQn6f .edgeTerminals{font-size:11px;}#mermaid-svg-l1JxVpgRojAHQn6f :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Context -state:State behavior() «interface» State Handle(con:Context) StateA Handle(con:Context) StateB Handle(con:Context) StateC Handle(con:Context) 2. 代码示例
2.1 设计 需求 环境有关闭、受限、正常三个状态环境有查看、评论、发布三种状态其对应关系如下 查看评论发布正常√√√受限√√×关闭××× 定义环境类Context 它依赖了抽象状态如果状态没有冲突你也可以写成状态的聚合它有一个成员是健康值它的一个内部方法用来修改状态虽然golang没有java对类的权限控制我们只能这么理解尽量不在“类之外调用”它的一个外部方法传入健康值同时修改环境状态 定义一个函数创建环境类这不是状态模式的重点仅为了方便实例化定义抽象状态State定义一个具体状态关闭模拟一个网站的用户状态 它的View()方法模式关闭状态用户不能查看它的Comment()方法模拟关闭状态用户不能评论它的Post()方法模拟关闭状态用户不能发布 定义一个具体状态限制模拟一个网站的用户状态 它的View()方法模式限制状态用户可以查看它的Comment()方法模拟限制状态用户可以评论它的Post()方法模拟限制状态用户不能发布 定义一个具体状态正常模拟一个网站的用户状态 它的View()方法模式正常状态用户可以查看它的Comment()方法模拟正常状态用户可以评论它的Post()方法模拟正常状态用户可以发布 调用 实例化一个环境类执行查看操作修改环境类健康值再次执行查看操作
2.2 代码
代码
package mainimport (fmt
)// 定义环境类
type Context struct {state StateHealthValue int
}// 根据环境类健康值修改环境状态
func (c *Context) changeState() {if c.HealthValue -10 {c.state Close{}} else if c.HealthValue -10 c.HealthValue 0 {c.state Restriction{}} else if c.HealthValue 0 {c.state Normal{}}
}// 设置环境类健康值
func (c *Context) SetHealth(value int) {c.HealthValue valuec.changeState()
}// 创建环境类
func CreateContext(health int) *Context {a : Context{HealthValue: health,}a.changeState()return a
}// 定义抽象状态类
type State interface {View()Comment()Post()
}// 定义第一个具体状态
type Close struct{}func (c *Close) View() {fmt.Println(无法查看)
}func (c *Close) Comment() {fmt.Println(不能评论)
}func (c *Close) Post() {fmt.Println(不能发布)
}// 定义第二个具体状态
type Restriction struct{}func (r *Restriction) View() {fmt.Println(查看正常)
}func (r *Restriction) Comment() {fmt.Println(评论正常)
}func (r *Restriction) Post() {fmt.Println(不能发布)
}// 定义第三个具体状态
type Normal struct{}func (n *Normal) View() {fmt.Println(查看正常)
}func (n *Normal) Comment() {fmt.Println(评论正常)
}func (n *Normal) Post() {fmt.Println(发布正常)
}func main() {context : CreateContext(75)context.state.View()fmt.Println(改变健康值)context.SetHealth(-20)context.state.View()
}输出
查看正常
改变健康值
无法查看2.3 类图 #mermaid-svg-T72ZPR4OH2moPcja {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-T72ZPR4OH2moPcja .error-icon{fill:#552222;}#mermaid-svg-T72ZPR4OH2moPcja .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-T72ZPR4OH2moPcja .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-T72ZPR4OH2moPcja .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-T72ZPR4OH2moPcja .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-T72ZPR4OH2moPcja .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-T72ZPR4OH2moPcja .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-T72ZPR4OH2moPcja .marker{fill:#333333;stroke:#333333;}#mermaid-svg-T72ZPR4OH2moPcja .marker.cross{stroke:#333333;}#mermaid-svg-T72ZPR4OH2moPcja svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-T72ZPR4OH2moPcja g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-T72ZPR4OH2moPcja g.classGroup text .title{font-weight:bolder;}#mermaid-svg-T72ZPR4OH2moPcja .nodeLabel,#mermaid-svg-T72ZPR4OH2moPcja .edgeLabel{color:#131300;}#mermaid-svg-T72ZPR4OH2moPcja .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-T72ZPR4OH2moPcja .label text{fill:#131300;}#mermaid-svg-T72ZPR4OH2moPcja .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-T72ZPR4OH2moPcja .classTitle{font-weight:bolder;}#mermaid-svg-T72ZPR4OH2moPcja .node rect,#mermaid-svg-T72ZPR4OH2moPcja .node circle,#mermaid-svg-T72ZPR4OH2moPcja .node ellipse,#mermaid-svg-T72ZPR4OH2moPcja .node polygon,#mermaid-svg-T72ZPR4OH2moPcja .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-T72ZPR4OH2moPcja .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-T72ZPR4OH2moPcja g.clickable{cursor:pointer;}#mermaid-svg-T72ZPR4OH2moPcja g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-T72ZPR4OH2moPcja g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-T72ZPR4OH2moPcja .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-T72ZPR4OH2moPcja .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-T72ZPR4OH2moPcja .dashed-line{stroke-dasharray:3;}#mermaid-svg-T72ZPR4OH2moPcja #compositionStart,#mermaid-svg-T72ZPR4OH2moPcja .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja #compositionEnd,#mermaid-svg-T72ZPR4OH2moPcja .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja #dependencyStart,#mermaid-svg-T72ZPR4OH2moPcja .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja #dependencyStart,#mermaid-svg-T72ZPR4OH2moPcja .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja #extensionStart,#mermaid-svg-T72ZPR4OH2moPcja .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja #extensionEnd,#mermaid-svg-T72ZPR4OH2moPcja .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja #aggregationStart,#mermaid-svg-T72ZPR4OH2moPcja .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja #aggregationEnd,#mermaid-svg-T72ZPR4OH2moPcja .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-T72ZPR4OH2moPcja .edgeTerminals{font-size:11px;}#mermaid-svg-T72ZPR4OH2moPcja :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Context -state State Int HealthValue SetHealth(value int) -changeState() «interface» State View() Comment() Post() Close View() Comment() Post() Restriction View() Comment() Post() Normal View() Comment() Post()