建网站 域名 空间,门户网站开发案例,网站如何做实名验证,软件制作平台1 意图
允许一个对象在其内部状态改变时改变它的行为#xff0c;对象看起来似乎修改了它的类。#xff08;这里的对象指的就是模型中的Context#xff0c;行为指的就是State的子类#xff09;
2 动机
考虑一个问题#xff1a;实现一个表示网络连接的类TCPConnection对象看起来似乎修改了它的类。这里的对象指的就是模型中的Context行为指的就是State的子类
2 动机
考虑一个问题实现一个表示网络连接的类TCPConnection它的对象的状态处于若干不同状态之一连接已建立Established、正在监听Listening、连接已关闭Closed。当一个TCPConection对象收到其他对象的请求时他根据自身的状态做出不同的反应。例如一个Open请求的结果依赖于该连接时处于连接已关闭还是连接已建立的状态。状态模式描述了TCPConnextion如何在每一个状态下表现出不同的行为。
实现方法关键思想是在TCPConnection引入一个TCPState的抽象类来表示网络连接的状态。TCPState类为各个不同的状态声明了一个或一套公共的接口。针对每个状态的行为实现TCPState的子类。例如TCPEstablished和TCPClosed类分别实现了特定于TCPConnection的连接已建立状态和连接已关闭状态的行为。 #mermaid-svg-cw93gvB9MmYO1WL1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cw93gvB9MmYO1WL1 .error-icon{fill:#552222;}#mermaid-svg-cw93gvB9MmYO1WL1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cw93gvB9MmYO1WL1 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-cw93gvB9MmYO1WL1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cw93gvB9MmYO1WL1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cw93gvB9MmYO1WL1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cw93gvB9MmYO1WL1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cw93gvB9MmYO1WL1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cw93gvB9MmYO1WL1 .marker.cross{stroke:#333333;}#mermaid-svg-cw93gvB9MmYO1WL1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cw93gvB9MmYO1WL1 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-cw93gvB9MmYO1WL1 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-cw93gvB9MmYO1WL1 .nodeLabel,#mermaid-svg-cw93gvB9MmYO1WL1 .edgeLabel{color:#131300;}#mermaid-svg-cw93gvB9MmYO1WL1 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-cw93gvB9MmYO1WL1 .label text{fill:#131300;}#mermaid-svg-cw93gvB9MmYO1WL1 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-cw93gvB9MmYO1WL1 .classTitle{font-weight:bolder;}#mermaid-svg-cw93gvB9MmYO1WL1 .node rect,#mermaid-svg-cw93gvB9MmYO1WL1 .node circle,#mermaid-svg-cw93gvB9MmYO1WL1 .node ellipse,#mermaid-svg-cw93gvB9MmYO1WL1 .node polygon,#mermaid-svg-cw93gvB9MmYO1WL1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cw93gvB9MmYO1WL1 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-cw93gvB9MmYO1WL1 g.clickable{cursor:pointer;}#mermaid-svg-cw93gvB9MmYO1WL1 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-cw93gvB9MmYO1WL1 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-cw93gvB9MmYO1WL1 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-cw93gvB9MmYO1WL1 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-cw93gvB9MmYO1WL1 .dashed-line{stroke-dasharray:3;}#mermaid-svg-cw93gvB9MmYO1WL1 #compositionStart,#mermaid-svg-cw93gvB9MmYO1WL1 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 #compositionEnd,#mermaid-svg-cw93gvB9MmYO1WL1 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 #dependencyStart,#mermaid-svg-cw93gvB9MmYO1WL1 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 #dependencyStart,#mermaid-svg-cw93gvB9MmYO1WL1 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 #extensionStart,#mermaid-svg-cw93gvB9MmYO1WL1 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 #extensionEnd,#mermaid-svg-cw93gvB9MmYO1WL1 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 #aggregationStart,#mermaid-svg-cw93gvB9MmYO1WL1 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 #aggregationEnd,#mermaid-svg-cw93gvB9MmYO1WL1 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-cw93gvB9MmYO1WL1 .edgeTerminals{font-size:11px;}#mermaid-svg-cw93gvB9MmYO1WL1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} TCPConnection -TCPState tpcState open() acknowledge() close() «interface» TCPState open() acknowledge() close() TCPOpen open() acknowledge() close() TCPEstablished open() acknowledge() close() TCPClosed open() acknowledge() close() TCPConnection类维护一个表示TCP连接当前状态的状态对象一个TCPState子类的实例。TCPConnection类将所有与状态相关的请求委托给这个状态的对象。TCPConnection使用它 的TCPState子类实例来执行特定于连接状态的操作。 一旦连接状态改变TCPConnection对象就会改表它所使用的状态对象。例如当连接从已建立状态转位已关闭状态时TCPConnection会用一个TCPClosed的实例来代替原来的TCPConnextion的实例至于怎么替换一般是在一个状态结束的时候掉用给TCPConnextion的TCPState变量设置成另外一个状态类实例。
使用场景
对象的行为取决于它的状态。并且它必须在运行的时根据状态改变它的行为。一个操作中含有大量的多分支的条件语句并且这些分支依赖于该对象的状态。这个状态通常有一个或者多个枚举常量表示。通常多个操作包含这一相同的条件结构。State模式将每个条件分支放入一个独立的类中。
结构 #mermaid-svg-nQjDJcnOLZtD5kc9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-nQjDJcnOLZtD5kc9 .error-icon{fill:#552222;}#mermaid-svg-nQjDJcnOLZtD5kc9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nQjDJcnOLZtD5kc9 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-nQjDJcnOLZtD5kc9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nQjDJcnOLZtD5kc9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nQjDJcnOLZtD5kc9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nQjDJcnOLZtD5kc9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nQjDJcnOLZtD5kc9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nQjDJcnOLZtD5kc9 .marker.cross{stroke:#333333;}#mermaid-svg-nQjDJcnOLZtD5kc9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nQjDJcnOLZtD5kc9 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-nQjDJcnOLZtD5kc9 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-nQjDJcnOLZtD5kc9 .nodeLabel,#mermaid-svg-nQjDJcnOLZtD5kc9 .edgeLabel{color:#131300;}#mermaid-svg-nQjDJcnOLZtD5kc9 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-nQjDJcnOLZtD5kc9 .label text{fill:#131300;}#mermaid-svg-nQjDJcnOLZtD5kc9 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-nQjDJcnOLZtD5kc9 .classTitle{font-weight:bolder;}#mermaid-svg-nQjDJcnOLZtD5kc9 .node rect,#mermaid-svg-nQjDJcnOLZtD5kc9 .node circle,#mermaid-svg-nQjDJcnOLZtD5kc9 .node ellipse,#mermaid-svg-nQjDJcnOLZtD5kc9 .node polygon,#mermaid-svg-nQjDJcnOLZtD5kc9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nQjDJcnOLZtD5kc9 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 g.clickable{cursor:pointer;}#mermaid-svg-nQjDJcnOLZtD5kc9 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-nQjDJcnOLZtD5kc9 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-nQjDJcnOLZtD5kc9 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-nQjDJcnOLZtD5kc9 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-nQjDJcnOLZtD5kc9 .dashed-line{stroke-dasharray:3;}#mermaid-svg-nQjDJcnOLZtD5kc9 #compositionStart,#mermaid-svg-nQjDJcnOLZtD5kc9 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 #compositionEnd,#mermaid-svg-nQjDJcnOLZtD5kc9 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 #dependencyStart,#mermaid-svg-nQjDJcnOLZtD5kc9 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 #dependencyStart,#mermaid-svg-nQjDJcnOLZtD5kc9 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 #extensionStart,#mermaid-svg-nQjDJcnOLZtD5kc9 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 #extensionEnd,#mermaid-svg-nQjDJcnOLZtD5kc9 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 #aggregationStart,#mermaid-svg-nQjDJcnOLZtD5kc9 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 #aggregationEnd,#mermaid-svg-nQjDJcnOLZtD5kc9 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-nQjDJcnOLZtD5kc9 .edgeTerminals{font-size:11px;}#mermaid-svg-nQjDJcnOLZtD5kc9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Context -State state «interface» State operate() StateA operate() StateB operate() StateC operate() 结构和策略模式一摸一样但实际上实现起来并不一样策略模式各个子类间可以说是完全独立的而状态模式各个子类间是紧密关联的各个状态子类之间组合出一个完整的行为通常来说他们之间还会互相依赖因为Context从一个状态到另一个状态的转变时需要在状态子类中实现。
应用
java 中 spring提供的状态机框架Spring Statemachine就是对状态模式思想的一种实现还有很多工作流的框架都是基于状态模式实现的