行为型模式 - 状态模式 (State Pattern)
状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。下面为你介绍几个状态模式的经典案例。
// 抽象状态类
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);}@Overridepublic void open() {System.out.println("电梯已经开门,无需重复操作");}@Overridepublic void close() {System.out.println("电梯门关闭");lift.setState(new ClosedState(lift));}@Overridepublic void run() {System.out.println("电梯门未关闭,不能运行");}@Overridepublic void stop() {System.out.println("电梯处于开门状态,已经停止");}
}// 关门状态类
class ClosedState extends LiftState {public ClosedState(Lift lift) {super(lift);}@Overridepublic void open() {System.out.println("电梯门打开");lift.setState(new OpenState(lift));}@Overridepublic void close() {System.out.println("电梯门已经关闭,无需重复操作");}@Overridepublic void run() {System.out.println("电梯开始运行");lift.setState(new RunningState(lift));}@Overridepublic void stop() {System.out.println("电梯已经停止,处于关门状态");}
}// 运行状态类
class RunningState extends LiftState {public RunningState(Lift lift) {super(lift);}@Overridepublic void open() {System.out.println("电梯正在运行,不能开门");}@Overridepublic void close() {System.out.println("电梯正在运行,门已经关闭");}@Overridepublic void run() {System.out.println("电梯正在运行,无需重复操作");}@Overridepublic void stop() {System.out.println("电梯停止运行");lift.setState(new StoppedState(lift));}
}// 停止状态类
class StoppedState extends LiftState {public StoppedState(Lift lift) {super(lift);}@Overridepublic void open() {System.out.println("电梯门打开");lift.setState(new OpenState(lift));}@Overridepublic void close() {System.out.println("电梯门已经关闭");}@Overridepublic void run() {System.out.println("电梯开始运行");lift.setState(new RunningState(lift));}@Overridepublic 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();}
}