首先看一段代码:
public class Work {
public static int hour = 0;
public static boolean workFinish = false;
//写程序的方法
public static void writeProgram(){
if(hour <=12){
System.out.println("当前时间"+hour+"开始上班");
}else if(hour <=13){
System.out.println("当前时间"+hour+"午休");
}else if(hour <=17){
System.out.println("当前时间"+hour+"下午开始上班");
}else {
if(workFinish){
System.out.println("当前时间:"+hour+"");
}else{
if(hour < 21){
System.out.println("当前时间:"+hour+"开始加班咯");
}else{
System.out.println("当前时间:"+hour+"不行咯,要睡觉咯");
}
}
}
}
当有很多条件判断时,且很多的条件判断后产生了很多的业务逻辑,虽然代码可以正常执行,但是要修改某个逻辑,既整改逻辑流程也许就回发生改变,从而加大了维护时间的成本,并且冗长的业务逻辑代码使代码不够精简,可读性很差。
所以引入状态模式,把每个逻辑流程封装成类,既这个流程的内在改变,从业务代码就转成了修改类。
引入状态模式后的代码:
public abstract class WorkState {
public abstract void WriteProgram(Works w);
}
将主要的业务功能封装成一个抽象,每个流程类去实现它就行:
package status;
public class AfternoonState extends WorkState {
@Override
public void WriteProgram(Works w) {
// TODO Auto-generated method stub
System.out.println(11);
if(w.getHour() < 17){
System.out.println("当前时间:"+w.getHour()+": 下午状态还不错,继续努力");
}else{
w.setState(new EveningState());
w.writeProgram();
}
}
}
package status;
public class EveningState extends WorkState{
@Override
public void WriteProgram(Works w) {
// TODO Auto-generated method stub
System.out.println(11);
if(w.tashFinished){
w.setState(new RestState());
w.writeProgram();
}else{
if(w.getHour() < 21){
System.out.println("当前时间:"+w.getHour() +" 加班疲累之极");
}else{
w.setState(new SleepingState());
w.writeProgram();
}
}
}
}
package status;
//上午工作 状态
public class ForenoonState extends WorkState {
@Override
public void WriteProgram(Works w) {
// TODO Auto-generated method stub
System.out.println(11);
if(w.getHour()< 12){
System.out.println("上午工作精神百倍 "+w.getHour());
}else{
w.setState(new NoonState());
w.writeProgram();
}
}
}
package status;
public class NoonState extends WorkState {
@Override
public void WriteProgram(Works w) {
// TODO Auto-generated method stub
System.out.println(11);
if(w.getHour() < 13 ){
System.out.println("当前时间:"+w.getHour()+" : 适合午饭、午休");
}else{
w.setState(new AfternoonState());
}
}
}
package status;
public class RestState extends WorkState {
@Override
public void WriteProgram(Works w) {
// TODO Auto-generated method stub
System.out.println(11);
System.out.println("当前时间: "+w.getHour()+" 下班回家了");
}
}
package status;
public class SleepingState extends WorkState {
@Override
public void WriteProgram(Works w) {
// TODO Auto-generated method stub
System.out.println(11);
System.out.println("当前时间: "+w.getHour()+" 睡着了");
}
}
工作运行方法:
package status;
public class Works {
private WorkState current;
public Works(){
current = new ForenoonState();
}
private double hour ;
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
private boolean finish = false;
public boolean tashFinished;
public boolean isFinish() {
return finish;
}
public void setFinish(boolean finish) {
this.finish = finish;
}
public void setState(WorkState s){
this.current = s;
}
public void writeProgram(){
current.WriteProgram(this);
}
}
Works project = new Works();
project.setHour(9);
project.writeProgram();
project.setHour(10);
project.writeProgram();
project.setHour(12);
project.writeProgram();
project.setHour(13);
project.writeProgram();
project.setHour(14);
project.writeProgram();
project.setHour(17);
project.writeProgram();
project.tashFinished = false;
project.writeProgram();
project.setHour(19);
project.writeProgram();
project.setHour(22);
project.writeProgram();
上午工作精神百倍 9.0
上午工作精神百倍 10.0
当前时间:12.0 : 适合午饭、午休
当前时间:14.0: 下午状态还不错,继续努力
当前时间:17.0 加班疲累之极
当前时间:17.0 加班疲累之极
当前时间:19.0 加班疲累之极
当前时间: 22.0 睡着了
所以在开发中会遇到 当一个对象的行为取决于它的状态时,并且它运行时根据它的状态改变它的行为时,就可以使用状态模式