【设计模式】行为型08状态模式(status Pattern)

状态模式(status Pattern)

      定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States)。与命令模式称为兄弟模式。

       简单来说,状态模式就是通过对象的状态来改变其行为,博主凭借模糊的记忆,简单还原一下许久之前看过的《大话设计模式》一书中的例子(这本书中的demo特别精致,推荐一读):

       类图:老毛病,以后画(美名曰日后复习)


       代码:

1、状态的接口所有状态接口继承此类:

package com.pat.status;
/**
 * 状态接口
 * @author ZX
 */
public interface Status {
	public void writeProgram(Work work);
}

2、状态实现类,这里定义了上午中午下午三个子状态:

package com.pat.status;
/**
 * 状态1,上午的状态
 * @author Administrator
 *
 */
public class MorningStatus implements Status{

	@Override
	public void writeProgram(Work work) {
		if(work==null) {return;}
		if(work.getHour()<=12) {//小于12点
			System.out.println("当前"+work.getHour()+"点,做上午工作");
		}else {//大于12点进入中午的状态
			work.setCurrerntStatus(new NoonStatus());
			work.doWork();
			
		}
		
	}

}


package com.pat.status;
/**
 * 状态2:中午的状态
 * @author Administrator
 *
 */
public class NoonStatus implements Status{

	@Override
	public void writeProgram(Work work) {
		if(work==null) {return;}
		if(work.getHour()<=13) {//小于1点
			System.out.println("当前"+work.getHour()+"点,休息");
		}else {//大于1点进入中午的状态
			work.setCurrerntStatus(new AfternoonStatus());
			work.doWork();
			
		}
		
	}

}


package com.pat.status;
/**
 * 状态3:下午的状态
 * @author Administrator
 *
 */
public class AfternoonStatus implements Status{

	@Override
	public void writeProgram(Work work) {
		if(work==null) {return;}
		if(work.getHour()<=18) {//小于18点
			System.out.println("当前"+work.getHour()+"点,下午工作");
		}else {//大于18点进入中午的状态
			System.out.println("干毛线,下班了还干");
			
		}
		
	}
}

3、工作类:

package com.pat.status;
/**
 * 工作类
 * @author ZX
 *
 */
public class Work {
	private int hour;
	private boolean isFinshed;
	private Status currerntStatus;
	
	
	//constructor
	public Work() {
		//设置初始状态-早上的状态
		this.currerntStatus= new MorningStatus();
	}
	public void doWork() {
		currerntStatus.writeProgram(this);
	}
	
	
	
	
	public int getHour() {
		return hour;
	}
	public void setHour(int hour) {
		this.hour = hour;
	}
	public boolean isFinshed() {
		return isFinshed;
	}
	public void setFinshed(boolean isFinshed) {
		this.isFinshed = isFinshed;
	}
	public Status getCurrerntStatus() {
		return currerntStatus;
	}
	public void setCurrerntStatus(Status currerntStatus) {
		this.currerntStatus = currerntStatus;
	}
	
	
	
	
	
	
}

4、测试:

package com.pat.status;

public class Test {
	public static void main(String[] args) {
		Work work = new Work();
		//当前9点
		work.setHour(9);
		work.doWork();
		//当前13点
		work.setHour(13);
		work.doWork();
		work.setHour(16);
		work.doWork();
		work.setHour(20);
		work.doWork();
	}
}







     











原文地址:https://www.cnblogs.com/the-fool/p/11054145.html