状态模式 – AK47状态
首先定义状态抽象类
- 状态中含有上下文对象
public abstract class AK47State {
protected AK47Context ak47Context;
public void setAk47Context(AK47Context ak47Context) {
this.ak47Context = ak47Context;
}
/**
* 开火
*/
public abstract void fire();
/**
* 换弹
*/
public abstract void reload();
/**
* 暂停/等待开火
*/
public abstract void pause();
}
开火状态
public class AK47FireState extends AK47State {
@Override
public void fire() {
System.out.println("继续开火:-----------");
}
@Override
public void reload() {
throw new RuntimeException("开火中,不能换弹----");
}
@Override
public void pause() {
System.out.println("暂停......");
super.ak47Context.setAk47State(AK47Context.PAUSE_STATE);
}
}
换弹状态
public class AK47ReloadState extends AK47State {
@Override
public void fire() {
throw new RuntimeException("换弹中不能开火_______");
}
@Override
public void reload() {
System.out.println("继续换弹___________");
}
@Override
public void pause() {
System.out.println("就绪.....");
super.ak47Context.setAk47State(AK47Context.PAUSE_STATE);
}
}
暂停/就绪状态
public class AK47PauseState extends AK47State {
@Override
public void fire() {
System.out.println("开火:-----------");
super.ak47Context.setAk47State(AK47Context.FIRE_STATE);
}
@Override
public void reload() {
System.out.println("换弹___________");
super.ak47Context.setAk47State(AK47Context.RELOAD_STATE);
}
@Override
public void pause() {
System.out.println("暂停/就绪中......");
}
}
状态上下文
public class AK47Context {
private AK47State ak47State;
public static final AK47FireState FIRE_STATE = new AK47FireState();
public static final AK47ReloadState RELOAD_STATE = new AK47ReloadState();
public static final AK47PauseState PAUSE_STATE = new AK47PauseState();
public AK47State getAk47State() {
return ak47State;
}
public void setAk47State(AK47State ak47State) {
this.ak47State = ak47State;
this.ak47State.setAk47Context(this);
}
public void fire() {
this.ak47State.fire();
}
public void reload() {
this.ak47State.reload();
}
public void pause() {
this.ak47State.pause();
}
}
测试类
public class Test {
public static void main(String[] args) {
AK47Context ak47Context = new AK47Context();
ak47Context.setAk47State(new AK47PauseState());
ak47Context.fire();
ak47Context.fire();
ak47Context.pause();
ak47Context.reload();
ak47Context.pause();
ak47Context.fire();
}
}
运行结果
开火:-----------
继续开火:-----------
暂停......
换弹___________
就绪.....
开火:-----------