设计模式 —— 状态模式(State Pattern)
状态模式(State Pattern)
组成:Context(上下文):1般是1个具有多个状态的类,当调用 request() 函数时会被拜托到状态对象。 State(状态接口):定义了所有具体状态的共同接口,任何状态都实现这个接口,这样就可以在状态之间相互转换。 ConcreteStateA(具体状态):实现状态接口,处理来自 Context 的要求。每一个 ConcreteState 都提供自己要求的实现。 例子:
假定目前就这么多状态,用传统的 if…else 和 switch 实现。 抽象状态类 public abstract class LiftState {
//4种状态
final int OPEN_STATE = 1;
final int STOP_STATE = 2;
final int CLOSE_STATE = 3;
final int RUN_STATE = 4;
public abstract void setState(int state);
//开门动作
public abstract void open();
//关门动作
public abstract void close();
//运行动作
public abstract void run();
//停止动作
public abstract void stop();
} public class Lift extends LiftState{
private int state;
public Lift(int state) {
this.state = state;
}
@Override
public void setState(int state) {
this.state = state;
}
//开门动作
@Override
public void open() {
switch (state) {
case OPEN_STATE:
System.out.println("处于开门状态:甚么也不做");
break;
case CLOSE_STATE:
System.out.println("处于关门状态:甚么也不做");
break;
case RUN_STATE:
System.out.println("处于运行状态:甚么也不做");
break;
case STOP_STATE:
System.out.println("处于关门状态,开门...");
setState(OPEN_STATE);
break;
}
}
//关门动作
@Override
public void close() {
switch (state) {
case OPEN_STATE:
System.out.println("处于开门状态:关门...");
setState(CLOSE_STATE);
break;
case CLOSE_STATE:
System.out.println("处于关门状态:甚么也不做");
break;
case RUN_STATE:
System.out.println("处于运行状态:甚么也不做");
break;
case STOP_STATE:
System.out.println("处于停止状态:甚么也不做");
break;
}
}
//运行动作
@Override
public void run() {
switch (state) {
case OPEN_STATE:
System.out.println("处于开门状态:甚么也不做");
break;
case CLOSE_STATE:
System.out.println("处于关门状态:运行...");
setState(RUN_STATE);
break;
case RUN_STATE:
System.out.println("处于运行状态:甚么也不做");
break;
case STOP_STATE:
System.out.println("处于停止状态:运行...");
setState(RUN_STATE);
}
}
//停止动作
@Override
public void stop() {
switch (state) {
case OPEN_STATE:
System.out.println("处于开门状态:甚么也不做");
break;
case CLOSE_STATE:
System.out.println("处于关门状态:甚么也不做");
setState(CLOSE_STATE);
break;
case RUN_STATE:
System.out.println("处于运行状态:停止...");
break;
case STOP_STATE:
System.out.println("处于停止状态:甚么也不做");
}
}
} public class LiftRun {
public static void main(String[] args) {
//初始设置为停止状态
Lift lift = new Lift(2);
//停止变成运行
lift.run();
//运行时不能开门
lift.open();
//运行变成停止
lift.stop();
//停止时不能开门
lift.close();
}
}
状态模式改进例子:LiftState: public abstract class LiftState {
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();
} CloseState: public class CloseState extends LiftState {
public CloseState(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("处于关闭状态:运行");
lift.setState(lift.getRunState());
}
@Override
public void stop() {
System.out.println("处于关闭状态...甚么也不做");
}
} OpenState: public 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(lift.getCloseState());
}
@Override
public void run() {
System.out.println("处于开门状态...甚么也不错");
}
@Override
public void stop() {
System.out.println("处于开门状态...甚么也不错");
}
} RunState: public class RunState extends LiftState {
public RunState(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(lift.getStopState());
}
} StopState: public class StopState extends LiftState {
public StopState(Lift lift) {
super(lift);
}
@Override
public void open() {
System.out.println("处于停止状态:开门");
lift.setState(lift.getOpenState());
}
@Override
public void close() {
System.out.println("处于停止状态...甚么也不做");
}
@Override
public void run() {
System.out.println("处于停止状态:运行");
lift.setState(lift.getRunState());
}
@Override
public void stop() {
System.out.println("处于停止状态...甚么也不做");
}
} Lift: public class Lift {
LiftState openState;
LiftState closeState;
LiftState runState;
LiftState stopState;
LiftState state;
public Lift() {
openState = new OpenState(this);
closeState = new CloseState(this);
runState = new RunState(this);
stopState = new StopState(this);
//起始设置为停止状态
state = stopState;
}
//拜托给状态对象履行
public void stop() {
state.stop();
}
public void run() {
state.run();
}
public void close() {
state.close();
}
public void open() {
state.open();
}
//仅仅更换当前对象的援用
public void setState(LiftState state) {
this.state = state;
}
public LiftState getOpenState() {
return openState;
}
public LiftState getCloseState() {
return closeState;
}
public LiftState getRunState() {
return runState;
}
public LiftState getStopState() {
return stopState;
}
} LiftRun: public class LiftRun {
public static void main(String[] args) {
//其实设置为停止状态
Lift lift = new Lift();
lift.run();
lift.open();
lift.stop();
lift.close();
}
} 运行结果:
如增加故障状态: public class BugState extends LiftState {
public BugState(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(lift.getStopState());
}
@Override
public void bug() {
System.out.println("故障状态");
}
} 在每一个状态对象中加入相应的 bug 状态函数,如: @Override
public void bug() {
System.out.println("处于停止状态:维修电梯");
lift.setState(lift.getBugState());
} 接着在 Lift 类中加入 bug 状态: LiftState bugState;
...
//构造函数中
bugState = new BugState(this);
...
public LiftState getBugState() {
return bugState;
} 测试函数: public class LiftRun {
public static void main(String[] args) {
//其实设置为停止状态
Lift lift = new Lift();
//运行
lift.run();
lift.bug();
lift.stop();
lift.run();
}
}
适用处景:
优缺点:优点:
缺点:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |