对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的。状态模式其实就是某一个对象在某个过程或者时间的一个状态记录,但是这个状态的顺序不能发生变化,在程序设计方面可能要比其他模式稍微复杂点,请待我慢慢将来。
本人喜欢用代码来形象的讲述原理,可能是因为对单纯的看些理论的书有些反感或者无趣吧,我希望以后的教育也如此,要不大家都不高考了。。。嘿嘿说多了
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
还是代码呈现吧,概念太抽象了。
1、状态类,在该状态干什么
/**
* @author jzhf
*2014-11-06
*/
public interface State {
//在设定状态下做什么工作
public void writeProgram(Work work);
}
2、工作类,记录了当前状态的时间、完成情况、当前状态
public class Work {
private int hour;//工作时间
private boolean finished;
private State currentState;
public Work(){
currentState = new ForenoonState();//上午九点开始上班
}
//完成工作状态设置
public boolean taskFinished(){
return finished;
}
//工作内容
public void writeProgram(){
currentState.writeProgram(this);
}
public int getHour() {
return hour;
}
public void setHour(int hour) {
this.hour = hour;
}
public boolean isFinished() {
return finished;
}
public void setFinished(boolean finished) {
this.finished = finished;
}
public State getCurrentState() {
return currentState;
}
public void setCurrentState(State currentState) {
this.currentState = currentState;
}
}
3、上午九点状态
public class ForenoonState implements State {
/* (non-Javadoc)
* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)
*/
public void writeProgram(Work work) {
// TODO Auto-generated method stub
if(work != null){
//当在上午工作时
if(work.getHour() < 12){
System.out.println("当前时间:"+work.getHour()+"点 上午工作,精神百倍");
}else{
//否则转到下午工作状态
work.setCurrentState(new NoonState());
work.writeProgram();
}
}
}
}
4、中午状态
public class NoonState implements State {
/* (non-Javadoc)
* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)
*/
public void writeProgram(Work work) {
// TODO Auto-generated method stub
if(work != null){
//当在下午时
if(work.getHour() <13){
System.out.println("当前时间:"+work.getHour()+"点 犯困,午休");
}else{
//否则转到下午工作状态
work.setCurrentState(new AfterNoonState());
work.writeProgram();
}
}
}
}
5、下午状态
public class AfterNoonState implements State {
/* (non-Javadoc)
* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)
*/
public void writeProgram(Work work) {
// TODO Auto-generated method stub
if(work != null){
//当在下午时
if(work.getHour() <17){
System.out.println("当前时间:"+work.getHour()+"点 下午状态还不错,继续努力");
}else{
//否则转到晚上工作状态
work.setCurrentState(new EveningState());
work.writeProgram();
}
}
}
}
6、晚上加班状态
public class EveningState implements State {
/* (non-Javadoc)
* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)
*/
public void writeProgram(Work work) {
// TODO Auto-generated method stub
if(work != null){
//当在下午时
if(work.taskFinished()){
System.out.println("当前时间:"+work.getHour()+"点 下班了。。。");
work.setCurrentState(new SleepingState());
work.writeProgram();
}else if(work.getHour() <21){
System.out.println("当前时间:"+work.getHour()+"点 加班中。。。");
}
}
}
}
7、如果不加班,直接睡觉,状态结束
public class SleepingState implements State {
/* (non-Javadoc)
* @seecom.test.model.state.State#writeProgram(com.test.model.state.Work)
*/
public void writeProgram(Work work) {
// TODO Auto-generated method stub
System.out.println("当前时间:"+work.getHour()+"点 睡觉了。");
}
}
8、客户端
public class StateClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Workwork = new Work();
work.setHour(9);//开始上班
work.writeProgram();//开始工作
work.setHour(11);
work.writeProgram();
work.setHour(12);
work.writeProgram();
work.setHour(13);
work.writeProgram();
work.setHour(14);
work.writeProgram();
work.setHour(17);
//如果没有工作完继续
work.setFinished(true);
work.writeProgram();
work.setHour(21);
work.writeProgram();
work.setHour(22);
work.setFinished(true);
work.writeProgram();
}
}
通过代码讲述一个故事,对状态模式有了很形象的诠释,我想不用解释也能理解状态模式是什么了,就是一个过程的某个点的状态,并且该状态是由顺序的。状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
总结:状态模式就是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来,说白了目的就是为了消除庞大的条件分支语句。