java getstate_状态模式(State)_java实现

//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();

}

}

输出如下:

53bddcd57bd772227399bd272eeaf44f.png

以上

希望对大家有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值