行为型模式 - 状态模式 (State Pattern)
行为型模式 - 状态模式 (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);
}
@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();
}
}