前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、状态模式是什么?
基本介绍
- 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为的是一一对应的,状态之间可以相互转换
- 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类
二、使用步骤
状态类
其中关联了四个状态值
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();
}
编写环境角色类
public class Context {
public final static OpeningState OPENING_STATE = new OpeningState();
public final static ColseingState COLSEING_STATE = new ColseingState();
public final static StopingState STOPING_STATE = new StopingState();
public final static RuningState RUNING_STATE = new RuningState();
// 状态变量
private LiftState liftState;
public LiftState getLiftState() {
return liftState;
}
public void setLiftState(LiftState liftState) {
this.liftState = liftState;
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();
}
}
四个状态类
关闭状态
public class ColseingState extends LiftState {
@Override
public void open() {
super.context.setLiftState(Context.OPENING_STATE);
super.context.open();
}
@Override
public void close() {
System.out.println("电梯们关闭。。。");
}
@Override
public void run() {
super.context.setLiftState(Context.RUNING_STATE);
super.context.run();
}
@Override
public void stop() {
super.context.setLiftState(Context.STOPING_STATE);
super.context.stop();
}
}
启动状态
public class OpeningState extends LiftState {
@Override
public void open() {
System.out.println("电梯开启");
}
@Override
public void close() {
super.context.setLiftState(Context.COLSEING_STATE);
super.context.close();
}
@Override
public void run() {
// 什么都不做
}
@Override
public void stop() {
// no
}
}
运行状态
public class RuningState extends LiftState {
@Override
public void open() {
}
@Override
public void close() {
}
@Override
public void run() {
System.out.println("电梯正在运行中");
}
@Override
public void stop() {
super.context.setLiftState(Context.STOPING_STATE);
super.context.stop();
}
}
停止状态
public class StopingState extends LiftState {
@Override
public void open() {
super.context.setLiftState(Context.OPENING_STATE);
super.context.getLiftState().open();
}
@Override
public void close() {
super.context.setLiftState(Context.COLSEING_STATE);
super.context.getLiftState().close();
}
@Override
public void run() {
super.context.setLiftState(Context.RUNING_STATE);
super.context.getLiftState().run();
}
@Override
public void stop() {
System.out.println("电梯停止了。。。");
}
}
使用
public class Client {
public static void main(String[] args) {
// 创建环境对象
Context context = new Context();
// 设置当前电梯状态
context.setLiftState(new ColseingState());
context.open();
context.run();
context.close();
context.stop();
}
}
输出
总结
- Context 类为环境角色,用于维护State实例,这个示例定义当前状态
- State 是抽象类状态角色,定义一个接口封装与Context的一个特点接口相关行为
- ConcreteState 具体的状态角色,每个子类实现一个与Context的一个状态相关行为
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112531.html