定义:当一个对象内在状态改变时运行其改变行为,这个对象看起来像改变了其类。
状态模式的核心是封装,状态的变更引起了行为的变更。
状态模式有三个角色:
1.State ---------------------抽象状态角色 接口或者抽象类,负责对象状态定义,并且封装环境角色 以实现状态切换。
2.ConcreteState -------- 具体状态角色 每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理(本状态下要做的事,以及本状态如何过度到其他状态)。
3.Context----------环境角色 定义客户端需要的接口,并且负责具体状态的切换。
下面以电梯状态切换为例。
/**
*
* Context
*
*/
public class Context {
public static final OpeningState openingState = new OpeningState();
public static final ClosingState closingState = new ClosingState();
public static final RunningState runningState = new RunningState();
public static final StopingState stopingState = new StopingState();
public LiftState currentState ;
public void setState(LiftState state){
currentState = state;
this.currentState.setContext(this);
}
public void open(){
this.currentState.open();
}
public void close(){
this.currentState.close();
}
public void run(){
this.currentState.run();
}
public void stop(){
this.currentState.stop();
}
}
/**
*
* 抽象状态角色
*
*/
public abstract class LiftState {
public Context context;
public void setContext(Context context){
this.context = context;
}
public abstract void open();
public abstract void close();
public abstract void run();
public abstract void stop();
}
public class ClosingState extends LiftState {
@Override
public void open() {
super.context.setState(Context.openingState);
super.context.currentState.open();
}
@Override
public void close() {
System.out.println("close lift");
}
@Override
public void run() {
super.context.setState(Context.runningState);
super.context.currentState.run();
}
@Override
public void stop() {
super.context.setState(Context.stopingState);
super.context.currentState.stop();
}
}
public class OpeningState extends LiftState {
@Override
public void open() {
System.out.println("open lift");
}
@Override
public void close() {
super.context.setState(Context.closingState);
super.context.currentState.close();
}
@Override
public void run() {
System.out.println("the lift is opening ,can't run");
}
@Override
public void stop() {
}
}
public class RunningState extends LiftState {
@Override
public void open() {
}
@Override
public void close() {
}
@Override
public void run() {
System.out.println("电梯运行.");
}
@Override
public void stop() {
super.context.setState(Context.stopingState);
super.context.currentState.stop();
}
}
public class StopingState extends LiftState {
@Override
public void open() {
super.context.setState(Context.openingState);
super.context.currentState.open();
}
@Override
public void close() {
}
@Override
public void run() {
super.context.setState(Context.runningState);
super.context.currentState.run();
}
@Override
public void stop() {
System.out.println("电梯停止了。");
}
}
public class Client {
public static void main(String[] args){
Context context = new Context();
context.setState(context.openingState);
context.close();
}
}
优点:
1.结构清晰 避免了过多的switch...case 或者if...else语句的使用,避免程序的复杂性,提高系统的可维护性。
2.遵循设计原则 体现了开闭原则和单一职责原则,每个状态都是一个子类。
3.封装性非常好
缺点:如果状态很多,子类就会太多,造成类膨胀。
使用场景:
1.行为随状态改变而改变的场景
2.条件、分支判断语句的替代者