//20210122
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现状态模式
状态模式核心思想:
- 符合迪米特原则,将大量分支语句变成类的形式
程序源代码:
- 此处实现一个电梯的状态转换
//电梯状态抽象类
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 ClosingState extends LiftState {
@Override
public void open() {
//电梯门关了可以再开
super.context.setLiftState(Context.OPENING_STATE);
super.context.getLiftState().open();
}
@Override
public void close() {
System.out.println("电梯门关闭");
}
@Override
public void run() {
//关门可以运行
super.context.setLiftState(Context.RUNNING_STATE);
super.context.getLiftState().run();
}
@Override
public void stop() {
//关门但是没有按楼层
super.context.setLiftState(Context.STOPPING_STATE);
super.context.getLiftState().stop();
}
}
//电梯门开启状态
public class OpeningState extends LiftState {
@Override
public void open() {
System.out.println("电梯门开启");
}
@Override
public void close() {
super.context.setLiftState(Context.CLOSING_STATE);
super.context.getLiftState().close();
}
//门开着不能运行
@Override
public void run() {
//什么都不做
System.out.println("开门状态不能运行");
}
//门开着已经停止了
@Override
public void stop() {
//什么都不做
System.out.println("电梯处于停止状态");
}
}
//电梯运行状态
public class RunningState extends LiftState {
@Override
public void open() {
//运行途中不可开门,故什么都不做
System.out.println("运行途中不能开门");
}
@Override
public void close() {
//门已经是关着的
System.out.println("门处于关闭状态,无法再关门");
}
@Override
public void run() {
System.out.println("电梯运行中……");
}
@Override
public void stop() {
//运行过程中可以停下
super.context.setLiftState(Context.STOPPING_STATE);
super.context.getLiftState().stop();
}
}
//电梯停止状态
public class StoppingState extends LiftState {
@Override
public void open() {
//停下可以开门
super.context.setLiftState(Context.OPENING_STATE);
super.context.getLiftState().open();
}
@Override
public void close() {
//开门状态转为关门状态
super.context.setLiftState(Context.CLOSING_STATE);
super.context.getLiftState().close();
}
@Override
public void run() {
//停止状态的电梯可以运行
super.context.setLiftState(Context.RUNNING_STATE);
super.context.getLiftState().run();
}
@Override
public void stop() {
//运行过程中可以停下
System.out.println("电梯已停止");
}
}
//测试主类
public class Main {
public static void main(String[] args) {
Context context = new Context();
//定义初始状态为关门(共四种初始值)
context.setLiftState(new RunningState());
context.open();
context.close();
context.run();
context.stop();
context.run();
context.stop();
context.open();
context.close();
}
}
- 输出如下:
以上
希望对大家有所帮助