设计模式 行为型模式 -- 状态模式
Posted CodeJiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式 行为型模式 -- 状态模式相关的知识,希望对你有一定的参考价值。
1. 状态模式
1.1 引入
1.2 定义
1.3 结构
1.3.1 典型的抽象状态类代码
1.3.2 典型的具体状态类代码
1.3.3 典型的环境类代码
1.4 状态转换的实现
1.4.1 第一种: 统一由环境类来负责状态之间的转换
1.4.2 第二种: 由具体状态类来负责状态之间的转换
1.5 电梯的案例
案例说明:
【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理。例如,如果电梯门现在处于运行时状态,就不能进行开门操作,而如果电梯门是停止状态,就可以执行开门操作。
类图如下:
代码实现:
LiftState.java
package com.tian.state.after;
/**
* @version v1.0
* @ClassName: LiftState
* @Description: 抽象状态类
*/
public abstract class LiftState {
//声明环境角色类变量
protected Context context;
public void setContext(Context context) {
this.context = context;
}
//电梯开启操作
public abstract void open();
//电梯关闭操作
public abstract void close();
//电梯运行操作
public abstract void run();
//电梯停止操作
public abstract void stop();
}
OpeningState.java
package com.tian.state.after;
/**
* @version v1.0
* @ClassName: OpeningState
* @Description: 电梯开启状态类:具体状态类
*/
public class OpeningState extends LiftState {
//当前状态要执行的方法
public void open() {
System.out.println("电梯开启。。。");
}
public void close() {
//修改状态
super.context.setLiftState(Context.CLOSING_STATE);
//调用当前状态中的context中的close方法
super.context.close();
}
public void run() {
//什么都不做
}
public void stop() {
//什么都不做
}
}
ClosingState.java
package com.tian.state.after;
/**
* @version v1.0
* @ClassName: OpeningState
* @Description: 电梯关闭状态类:具体状态类
*/
public class ClosingState extends LiftState {
@Override
//电梯门关闭,这是关闭状态要实现的动作
public void close() {
System.out.println("电梯门关闭...");
}
//电梯门关了再打开,逗你玩呢,那这个允许呀
@Override
public void open() {
super.context.setLiftState(Context.OPENING_STATE);
super.context.open();
}
//电梯门关了就跑,这是再正常不过了
@Override
public void run() {
super.context.setLiftState(Context.RUNNING_STATE);
super.context.run();
}
//电梯门关着,我就不按楼层
@Override
public void stop() {
super.context.setLiftState(Context.STOPPING_STATE);
super.context.stop();
}
}
RunningState.java
package com.tian.state.after;
/**
* @version v1.0
* @ClassName: OpeningState
* @Description: 电梯运行状态类:具体状态类
*/
public class RunningState extends LiftState {
//运行的时候开电梯门?你疯了!电梯不会给你开的
@Override
public void open() {
//do nothing
}
//电梯门关闭?这是肯定了
@Override
public void close() {//虽然可以关门,但这个动作不归我执行
//do nothing
}
//这是在运行状态下要实现的方法
@Override
public void run() {
System.out.println("电梯正在运行...");
}
//这个事绝对是合理的,光运行不停止还有谁敢做这个电梯?!估计只有上帝了
@Override
public void stop() {
super.context.setLiftState(Context.STOPPING_STATE);
super.context.stop();
}
}
StoppingState.java
package com.tian.state.after;
/**
* @version v1.0
* @ClassName: OpeningState
* @Description: 电梯停止状态类:具体状态类
*/
public class StoppingState extends LiftState {
//停止状态,开门,那是要的!
@Override
public void open() {
//状态修改
super.context.setLiftState(Context.OPENING_STATE);
//动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作
super.context.getLiftState().open();
}
@Override
public void close() {//虽然可以关门,但这个动作不归我执行
//状态修改
super.context.setLiftState(Context.CLOSING_STATE);
//动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作
super.context.getLiftState().close();
}
//停止状态再跑起来,正常的很
@Override
public void run() {
//状态修改
super.context.setLiftState(Context.RUNNING_STATE);
//动作委托为CloseState来执行,也就是委托给了ClosingState子类执行这个动作
super.context.getLiftState().run();
}
//停止状态是怎么发生的呢?当然是停止方法执行了
@Override
public void stop() {
System.out.println("电梯停止了...");
}
}
Context.java
package com.tian.state.after;
/**
* @version v1.0
* @ClassName: Context
* @Description: 环境角色类
*/
public class Context {
//定义对应状态对象的常量
public final static OpeningState OPENING_STATE = new OpeningState();
public final static ClosingState CLOSING_STATE = new ClosingState();
public final static RunningState RUNNING_STATE = new RunningState();
public final static StoppingState STOPPING_STATE = new StoppingState();
//定义一个当前电梯状态变量
private LiftState liftState;
public LiftState getLiftState() {
return liftState;
}
//设置当前状态对象
public void setLiftState(LiftState liftState) {
this.liftState = liftState;
//设置当前状态对象中的Context对象
this.liftState.setContext(this);
}
public void open() {
this.liftState.open();
}
public void close() {
this.liftState.close();
}
public void run() {
this.liftState.run();
}
public void stop() {
this.liftState.stop();
}
}
Client.java
package com.tian.state.after;
/**
* @version v1.0
* @ClassName: Client
* @Description: 客户端类:测试类
*/
public class Client {
public static void main(String[] args) {
//创建环境角色对象
Context context = new Context();
//设置当前电梯装填
context.setLiftState(new ClosingState());
context.open();
context.run();
context.close();
context.stop();
}
}
1.5.1 运行结果
1.6 优缺点分析 适用场景
1.6.1 优点:
1.6.2 缺点:
1.6.3 适用场景
以上是关于设计模式 行为型模式 -- 状态模式的主要内容,如果未能解决你的问题,请参考以下文章