状态模式:把执行的动作封装在跟状态有关的类里,由状态来决定动作该如何执行

曾经跟同事探讨过怎样给电梯的控制系统编程,讨论结果是如果用结构化的方式编写电梯的控制程序,系统一定很复杂很庞大。后来我用状态模式编写了一个简单的电梯控制程序,结果问题得到了极大的简化。以下是我编写的一个简单的单部电梯的控制程序的架构:

状态模式稍微复杂一些,首先,我们分析一部电梯可执行的动作有:关门、开门、上行、下行、停止。因此我们定义了一个ElevatorState接口,接口中有closeDoor()、openDoor()等五种电梯可执行的动作。

然后我们分析,单部电梯应有多种状态,包括:门关闭、门打开、上行中、下行中、已停止。因此我们定义了五个实现ElevatorState接口的类,DoorCloseState、DoorOpenState、MovingUpState、MovingDownState、StopState,分别对应电梯五种状态。五个状态类中都包括一个Elevator类型的成员,即电梯的类。

电梯类Elevator中有代表五种状态的成员,都是ElevatorState接口类型。Elevator类的构造方法中为代表五种状态的成员创建对应的实现类并赋值,如下:

publicElevator() {

stopState= new StopState(this);

movingUpState= new MovingUpState(this);

movingDownState= new MovingDownState(this);

doorOpenState= new DoorOpenState(this);

doorCloseState= new DoorCloseState(this);

state= stopState;

}

Elevator类中还有个call方法,代表用户呼叫电梯的动作,调用电梯当前状态的关门、上行或下行、停止、开门等动作,如下:

publicvoid call(int destFloor) {

if(destFloor != currentFloor) {

state.closeDoor();

if(destFloor > currentFloor) {

state.moveUp(destFloor);

}else if (destFloor < currentFloor) {

state.moveDown(destFloor);

}

state.stop();

state.openDoor();

}else {

System.out.println("Elevatoris at " + destFloor + " floor now.");

}

}

可以看出,对电梯能否执行当前动作,如何执行的逻辑被封装在电梯的状态类中,如此对逻辑的判断相对要简单的多,不用考虑多种状态下的情况,只考虑当前状态下如何处理,例如我们看一下电梯上行状态时如何处理开门动作:

publicvoidopenDoor()
{

System.out.println("Can‘topen
the door during move.");

}

可见此时不需要做任何逻辑判断,直接告诉用户:“在电梯移动中不能开门”。

状态模式针对对象可执行的动作与状态相关,而状态有很多的情况,此时使用状态模式将大大简化对逻辑的判断,使得代码条理清晰,不易混淆和出错。

时间: 2024-10-11 11:00:03

状态模式:把执行的动作封装在跟状态有关的类里,由状态来决定动作该如何执行的相关文章

State 状态模式

简介 状态模式允许一个对象在其内部[状态]改变的时候改变其[行为].这个对象看上去就像是改变了它的类一样. 用一句话来表述,状态模式把所研究的对象的[行为]包装在不同的[状态对象]里,[每一个状态对象]都属于[一个抽象状态类的一个子类].状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变. 状态模式将每[一个条件分支]放入[一个独立的类]中. 这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化. 角色 环境类Context:定义客户感兴

设计模式 ( 十八 ):State状态模式 -- 行为型

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

设计模式 ( 十七) 状态模式State(对象行为型)

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

设计模式—状态模式

转载自CSDN:http://blog.csdn.net/hguisu/article/details/7557252,以便查阅,非原创 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得"力不从心了".随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改

设计模式(20)--State(状态模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 2.模式特点: 状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以

JAVA设计模式:状态模式

声明:转载请说明来源:http://www.cnblogs.com/pony1223/p/7518226.html 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户的行为有这么几种:投入硬币.转动曲柄.退出硬币几种行为:那么糖果机呢一般有这几中状态,待机状态.持有硬币的准备状态.运行状态即正在售出状态和初始状态 这么几种正常状态. 我们发现处于不同状态的时候,持有的行为是不一样的,图如下: 如果我们采用传统的方法来写代码,那么在投入硬币这个行为操作的时候,我们

Head First设计模式之状态模式

一.定义 定义:允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:代码中包含大量与对象状态有关的条件语句. 如何解决:将各种具体的状态类抽象出来. 关键代码:通常命令模式的接口中只有一个方法.而状态模式的接口中有一个或者多个方法.而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值.也就是说,状态模式一般和对象的状态有关.实现类的方法有不同的功能,覆盖接口中的方法.

Java设计模式之状态模式

本文继续介绍23种设计模式系列之策略模式. 何时使用 State模式在实际使用中比较多,适合"状态"的切换.因为我们经常会使用If else if else 进行状态切换,如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 这里要阐述的是"开关切换状态" 和" 一般的状态判断"是有一些区别的," 一般的状态判断"也是有 if..elseif结构,例如: if (which==1) state=&q

第22章 行为型模式—状态模式

1. 状态模式(State Pattern)的定义 (1)定义:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. ①状态和行为,它们的关系可以描述为“状态决定行为” ②因状态是在运行期被改变,行为也会在运行期根据状态的改变而改变.看起来,同一个对象,在不同的运行时刻,行为是不一样的,就像是类被修改了一样. (2)状态模式的结构和说明 ①Context:环境,也称上下文,通常用来定义客户感兴趣的接口,同时维护一个来具体处理当前状态的实例对象. ②State:状态接口,用来封

设计模式笔记:状态模式&amp;策略模式

这几天一直在忙期末考和实训,写笔记的时间也没有多少,不说废话了: 这文主要写两种模式:状态跟策略,主要是因为他们的类图一样,并且比较简单,写在同一篇文章里面容易甄别 状态模式:允许对象在内部状态改变时改变他的行为,对象看起来好像修改了他的类 先保留概念的意思,在平常的编程中,如果需要不同的状态,很一般的做法是在你要操作的类里面定义不同的常量代表不同的状态,然后if-else依据不同的状态有不同的实现: 1.你可以想象大量的if-else语句造成的低可读性和低效率 2.其次是你修改这个类的时候很麻