java设计模式:状态模式
来源:互联网 发布:怎么做微信淘宝优惠卷 编辑:程序博客网 时间:2024/05/29 02:47
1.状态模式
状态模式(state),又称状态对象模式,是对象的行为模式。
状态模式允许对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
2.状态模式的结构
状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。示意图如下:
状态模式参与角色:
- 抽象状态(State)角色:定义接口,用来封装环境(Context)对象一个特定状态所对应的行为。
- 具体状态(ConcreteState):具体状态类有多个,分别实现了环境的一个状态对应的行文。
- 环境角色(Context):定义客户端感兴趣的接口(request),并且保留一个具体状态类的实例。这个实例给出环境对象的现有状态。
可以看出:客户端通过request请求Context环境类,而环境类通过state实例的处理,改变Context的呈现状态。
3.状态模式的效果
- 状态模式为系统的每一个状态都创立一个具体状态类。当系统的状态变化时,系统改变对应的状态类。而且一个特定状态的所有行为都被封装到一个特定的对象中,使得行为的定义局域化。如果有新的状态添加,不需要修改客户端和context,只需要添加一个新的状态类。
- 不必采用过程性的处理方式,使用很长的条件转移语句。
- 使系统状态变化变得很明显,不用使用一些变量来标识。
- 可以在系统的不同部分使用相同的一些状态类的对象。
- 状态模式的缺点是会造成大量的晓得状态类;优点是使程序避免大量的条件转移语句,更易维护。
4.一个实现:电梯系统
一个电梯,基本会有:开、关、正在升降和停止4个状态,每个状态下行为不一样,很适合使用状态模式。使用状态模式后的类图如下:
LiftState(抽象状态)
package com.patterns.state;/** * 抽象状态 * @author Administrator * */public abstract class LiftState { protected Context context; public abstract void open(); public abstract void close(); public abstract void run(); public abstract void stop();}
具体状态类:
ClosingState
package com.patterns.state;/** * 关闭状态的具体状态类,可以执行开,关和停止请求 * @author Administrator * */public class ClosingState extends LiftState {@Overridepublic void open() {//状态改变this.context.setLiftState(Context.openningState);//执行动作this.context.open();}@Overridepublic void close() {System.out.println("lift is closing");}@Overridepublic void run() {this.context.setLiftState(Context.runningState);this.context.run();}@Overridepublic void stop() {this.context.setLiftState(Context.stoppingState);this.context.stop();}}
package com.patterns.state;/** * 正在开门状态,只能执行开门请求 * @author Administrator * */public class OpenningState extends LiftState {@Overridepublic void open() {System.out.println("lift is openning .");}@Overridepublic void close() {//状态改变this.context.setLiftState(Context.ClosingState);this.context.close();}@Overridepublic void run() {}@Overridepublic void stop() {}}
RunningState
package com.patterns.state;/** * 正在运行状态,只会执行停止动作 * @author Administrator * */public class RunningState extends LiftState {@Overridepublic void open() {}@Overridepublic void close() {}@Overridepublic void run() {System.out.println("lift is running.");}@Overridepublic void stop() {this.context.setLiftState(Context.stoppingState);this.context.stop();}}
StoppingState
package com.patterns.state;/** * 停止状态,可以执行开门和运行请求 * @author Administrator * */public class StoppingState extends LiftState {@Overridepublic void open() {this.context.setLiftState(Context.openningState);this.context.open();}@Overridepublic void close() {}@Overridepublic void run() {this.context.setLiftState(Context.runningState);this.context.run();}@Overridepublic void stop() {System.out.println("lift is stopping");}}
Context(环境类)
package com.patterns.state;/** * 环境类 * @author Administrator * */public class Context {/** * 定义一些共享的状态类,可重复使用 */public static LiftState openningState = new OpenningState();public static LiftState ClosingState = new ClosingState();public static LiftState runningState = new RunningState();public static LiftState stoppingState = new StoppingState();protected LiftState state;public LiftState getLiftState() {return state;}//设置状态public void setLiftState(LiftState state) {this.state = state;//把环境告诉状态state.context = this;}//下面的函数,是把客户端的请求委托给状态类来执行public void open() {state.open();}public void close() {state.close();}public void run() {state.run();}public void stop() {state.stop();}}
Client(测试类)
package com.patterns.state;public class Client {/** * @param args */public static void main(String[] args) {//创建环境Context context = new Context();//初始化一个状态context.setLiftState(Context.stoppingState);//请求测试context.open();context.close();context.run();context.stop();}}
输出:
lift is openning .
lift is closing
lift is running.
lift is stopping
lift is closing
lift is running.
lift is stopping
5.状态模式和策略模式的区别
策略模式和状态模式的结构相同,所以很容易混淆。它们主要区别在于:
- 策略模式中一旦环境类选择了一个具体策略类,在整个环境类的生命周期中策略类是不会改变的。而状态模式的环境类中的状态有一个明显的状态转移。
- 策略模式的环境类自己选择具体策略类,而状态模式的环境类是被外在原因放进一个状态中。
- 策略模式的环境类并不明显告诉客户端自己所选的策略,而状态模式的状态是显示告诉客户端的。
- java设计模式-状态模式
- java设计模式---状态模式
- java设计模式---状态模式
- java设计模式---状态模式
- java设计模式:状态模式
- java设计模式-状态模式
- JAVA设计模式--状态模式
- Java设计模式--状态模式
- Java设计模式--状态模式
- java设计模式,状态模式
- JAVA设计模式--状态模式
- java 设计模式 状态模式
- java设计模式-状态模式
- JAVA 设计模式 状态模式
- JAVA设计模式:状态模式
- JAVA设计模式:状态模式
- JAVA-状态设计模式
- 设计模式--行为模式--状态模式--Java
- ios网络图片的加载
- SMALT手册
- poj2299
- anroid下的内容提供者:ContentProvider
- 第7周项目2-求两数正差值
- java设计模式:状态模式
- viewDidUnload,viewDidLoad,viewWillAppear,viewWillDisappear的作用以及区别
- 物联网操作系统Hello China V1.76(PC串口版)版本发布
- pushViewController/presentModalViewController/addSubView区别及使用方法
- SSH框架学习(四、在struts和spring基础上加入hibernate)
- 贵金属及外汇数据单盈利情况(数据单:914.6)(黄金:433.78)(白银:-694)
- 数据结构c++实现----[栈的应用]括号配对
- POJ 2352 Stars
- 黑马程序员--JAVA之反射