声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我QQ群:425120333
每人个每天都有自己的态度,或高兴、或伤心、或幸福等等。各个态度之间也能自由的切换,人有各种各样的状态,其他物品也有他
们各自的状态。比如说电梯就有各个状态,开门状态,关门状态,运行状态,停止状态。各个状态之间是能够相互切换的,但也有一定的限制:
开门状态--->关门状态;
关门状态--->开门状态、运行状态;
运行状态--->停止状态;
停止状态--->开门状态、运行状态;
这里表示的意思是各个状态之间能够进行的转换。比如是开门状态只能转换到关门状态,而无法转换到其他状态。
/**
* @introduce:具体电梯类
*
*/
public class Lift {
public static final LiftState OPEN_STATE = new OpenState();
public static final LiftState CLOSE_STATE = new CloseState();
public static final LiftState RUNNING_STATE = new RunningState();
public static final LiftState STOP_STATE = new StopState();
public LiftState state;
public LiftState getState() {
return state;
}
public void setState(LiftState state) {
this.state = state;
this.state.setLift(this);
}
public void open() {
this.state.open();
}
public void close() {
this.state.close();
}
public void running() {
this.state.running();
}
public void stop() {
this.state.stop();
}
}
/**
* @introduce:电梯状态抽象类
*
*/
public abstract class LiftState {
protected Lift lift;
protected void setLift(Lift lift) {
this.lift = lift;
}
public abstract void open();
public abstract void close();
public abstract void running();
public abstract void stop();
}
/**
* @introduce:开门状态
*
*/
public class OpenState extends LiftState {
@Override
public void open() {
System.out.println("---电梯门已开启......");
}
@Override
public void close() {
super.lift.setState(Lift.CLOSE_STATE);
super.lift.state.close();
}
@Override
public void running() {
System.out.println("***********警告:门开着不允许运行");
}
@Override
public void stop() {
System.out.println("***********警告:门开着已经是停止的");
}
}
/**
* @introduce:关门状态
*
*/
public class CloseState extends LiftState {
@Override
public void open() {
super.lift.setState(Lift.OPEN_STATE);
super.lift.open();
}
@Override
public void close() {
System.out.println("---电梯门已关闭......");
}
@Override
public void running() {
super.lift.setState(Lift.RUNNING_STATE);
super.lift.running();
}
@Override
public void stop() {
System.out.println("***********警告:电梯未运行,不用停止");
}
}
/**
* @introduce:运行状态
*
*/
public class RunningState extends LiftState {
@Override
public void open() {
System.out.println("***********警告:运行中不允许开门");
}
@Override
public void close() {
System.out.println("***********警告:运行中门已经是关闭的");
}
@Override
public void running() {
System.out.println("---电梯门正在运行中......");
}
@Override
public void stop() {
super.lift.setState(Lift.STOP_STATE);
super.lift.stop();
}
}
/**
* @introduce:停止状态
*
*/
public class StopState extends LiftState {
@Override
public void open() {
super.lift.setState(Lift.OPEN_STATE);
super.lift.open();
}
@Override
public void close() {
System.out.println("***********警告:停止状态门已经是关闭的");
}
@Override
public void running() {
super.lift.setState(Lift.RUNNING_STATE);
super.lift.running();
}
@Override
public void stop() {
System.out.println("---电梯门已停止......");
}
}
/**
* @introduce:场景类
*
*/
public class Client {
public static void main(String[] args) {
Lift lift = new Lift();
System.out.println("----------开门状态下的转换------------");
lift.setState(new OpenState());
lift.running();
lift.stop();
lift.close();
System.out.println("----------关门状态下的转换------------");
lift.stop();
lift.open();
lift.close();
lift.running();
System.out.println("----------运行状态下的转换------------");
lift.open();
lift.close();
lift.stop();
System.out.println("----------停止状态下的转换------------");
lift.close();
lift.running();
lift.stop();
lift.open();
}
}
控制台输出:
———-开门状态下的转换————
*警告:门开着不允许运行
*警告:门开着已经是停止的
—电梯门已关闭……
———-关门状态下的转换————
*警告:电梯未运行,不用停止
—电梯门已开启……
—电梯门已关闭……
—电梯门正在运行中……
———-运行状态下的转换————
*警告:运行中不允许开门
*警告:运行中门已经是关闭的
—电梯门已停止……
———-停止状态下的转换————
*警告:停止状态门已经是关闭的
—电梯门正在运行中……
—电梯门已停止……
—电梯门已开启……
通过模拟电梯各个状态之间的转换来理解状态模式的使用,状态模式指的是当一个对象内在状态改变时允许改变其行为,使得该对象
看起来改变了状态。状态模式适用于行为受对象约束的情况下使用,而且使用时对象的状态最好不要超过5个。
参考大牛博客:http://www.cnblogs.com/zuoxiaolong/p/pattern22.html