行为型模式 - 状态模式 (State Pattern)

时间:2025-03-05 08:11:44
// 抽象状态类 abstract class LiftState { protected Lift lift; public LiftState(Lift lift) { this.lift = lift; } public abstract void open(); public abstract void close(); public abstract void run(); public abstract void stop(); } // 电梯类 class Lift { private LiftState currentState; public Lift() { // 初始状态为关门状态 this.currentState = new ClosedState(this); } public void setState(LiftState state) { this.currentState = state; } public void open() { currentState.open(); } public void close() { currentState.close(); } public void run() { currentState.run(); } public void stop() { currentState.stop(); } } // 开门状态类 class OpenState extends LiftState { public OpenState(Lift lift) { super(lift); } @Override public void open() { System.out.println("电梯已经开门,无需重复操作"); } @Override public void close() { System.out.println("电梯门关闭"); lift.setState(new ClosedState(lift)); } @Override public void run() { System.out.println("电梯门未关闭,不能运行"); } @Override public void stop() { System.out.println("电梯处于开门状态,已经停止"); } } // 关门状态类 class ClosedState extends LiftState { public ClosedState(Lift lift) { super(lift); } @Override public void open() { System.out.println("电梯门打开"); lift.setState(new OpenState(lift)); } @Override public void close() { System.out.println("电梯门已经关闭,无需重复操作"); } @Override public void run() { System.out.println("电梯开始运行"); lift.setState(new RunningState(lift)); } @Override public void stop() { System.out.println("电梯已经停止,处于关门状态"); } } // 运行状态类 class RunningState extends LiftState { public RunningState(Lift lift) { super(lift); } @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() { System.out.println("电梯停止运行"); lift.setState(new StoppedState(lift)); } } // 停止状态类 class StoppedState extends LiftState { public StoppedState(Lift lift) { super(lift); } @Override public void open() { System.out.println("电梯门打开"); lift.setState(new OpenState(lift)); } @Override public void close() { System.out.println("电梯门已经关闭"); } @Override public void run() { System.out.println("电梯开始运行"); lift.setState(new RunningState(lift)); } @Override public void stop() { System.out.println("电梯已经停止,无需重复操作"); } } // 客户端代码 public class LiftSystem { public static void main(String[] args) { Lift lift = new Lift(); // 开门 lift.open(); // 尝试运行(开门状态下不能运行) lift.run(); // 关门 lift.close(); // 运行 lift.run(); // 停止 lift.stop(); // 开门 lift.open(); } }