- 定义:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。状态模式的核心是封装,状态的变更引起了行为的变更,从外部看起来就好像这个对象对应的类发生了改变一样
环境角色有两个不成文的约束:
-
把状态对象声明为静态常量,有几个状态对象就声明几个静态常量。
-
环境角色具有状态抽象角色定义的所有行为,具体执行使用委托方式。
package state;
/**
* @author hyh
* @create 2021-08-28 11:05
* 抽象一个电梯
*/
public abstract class Elevator {
public StateManage stateManage;
public void setState(StateManage state) {
this.stateManage = state;
}
// 电梯开门
public abstract void openDoor();
//电梯关门
public abstract void closeDoor();
//电梯运行
public abstract void run();
//电梯停止
public abstract void stop();
}
// 打开状态 只能关门
class OpenState extends Elevator{
@Override
public void openDoor() {
System.out.println("电梯门打开");
}
@Override
public void closeDoor() {
super.stateManage.setState(StateManage.closeState);
super.stateManage.getCurrentState().closeDoor();
}
@Override
public void run() {
System.out.println("电梯门还开着,不能运行");
}
@Override
public void stop() {
System.out.println("门开着,当然是停止的");
}
}
// 关门状态 可以运行 可以停止 可以开门
class CloseState extends Elevator{
@Override
public void openDoor() {
super.stateManage.setState(StateManage.openState);
super.stateManage.getCurrentState().openDoor();
}
@Override
public void closeDoor() {
System.out.println("电梯门关闭");
}
@Override
public void run() {
// 暂时没用到
//super.stateManage.setState();
super.stateManage.getCurrentState().run();
}
@Override
public void stop() {
// 暂时没用到
//super.stateManage.setState();
super.stateManage.getCurrentState().stop();
}
}
// 状态管理
class StateManage{
public static OpenState openState = new OpenState();
public static CloseState closeState = new CloseState();
private Elevator currentState;
public void setState(Elevator currentState) {
this.currentState = currentState;
this.currentState.setState(this);
}
public Elevator getCurrentState() {
return currentState;
}
public void openDoor() {
this.currentState.openDoor();
}
public void closeDoor() {
this.currentState.closeDoor();
}
public void run() {
this.currentState.run();
}
public void stop() {
this.currentState.stop();
}
}
class Test{
public static void main(String[] args) {
StateManage stateManage = new StateManage();
// 初始状态门打开
stateManage.setState(new OpenState());
stateManage.openDoor();
stateManage.closeDoor();
}
}
输出:
电梯门打开
电梯门关闭
class Test{
public static void main(String[] args) {
StateManage stateManage = new StateManage();
// 初始状态门打开
stateManage.setState(new OpenState());
// 运行
stateManage.run();
}
}
输出:
电梯门还开着,不能运行