状态模式

状态模式、;当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

1、State抽象类

<span style="font-size:18px;">public abstract class State
{
public abstract void writeProgram(Work work);
}</span>
2、Work类
<span style="font-size:18px;">public class Work
{
	private State current;

	public Work()
	{
		current = new ForenoonState();
	}

	private double hour;

	public void setHour(double hour)
	{
		this.hour = hour;
	}

	public double getHour()
	{
		return hour;
	}

	private Boolean finish = false;

	public boolean getTaskFinished()
	{
		return finish;
	}

	public void setTaskFinished(Boolean finish)
	{
		this.finish = finish;
	}
	public void setState(State s)
	{
		this.current=s;
	}
	public void writeProgram()
	{
		// TODO Auto-generated method stub
      current.writeProgram(this);
	}
}
</span>
3、ForenoonState类
<span style="font-size:18px;">public class ForenoonState extends State
{

	@Override
	public void writeProgram(Work work)
	{
		// TODO Auto-generated method stub
      if(work.getHour()<12)
      {
    	  System.out.println("当前时间"+work.getHour()+"上午工作,精神百倍");
      }
      else
      {
    	  work.setState(new NoonState());
    	  work.writeProgram();
      }
	}

}
</span>
4、NoonState类

<span style="font-size:18px;">public class NoonState extends State
{

	@Override
	public void writeProgram(Work work)
	{
		// TODO Auto-generated method stub
     if(work.getHour()<13)
     {
    	 System.out.println("当前时间:"+work.getHour()+"饿了,午饭;犯困,午休");
     }
     else
     {
    	 work.setState(new AfternoonState());
    	 work.writeProgram();
     }
	}

}
</span>

5、AfternoonState类

<span style="font-size:18px;">public class AfternoonState extends State
{

	@Override
	public void writeProgram(Work work)
	{
		// TODO Auto-generated method stub
     if(work.getHour()<17)
     {
    	 System.out.println("当前时间"+work.getHour()+"下午状态还不错,继续努力");
     }
     else
     {
    	 work.setState(new EveningState());
    	 work.writeProgram();
     }
	}

}</span>
6、EveningState类

<span style="font-size:18px;">public class EveningState extends State
{

	@Override
	public void writeProgram(Work work)
	{
		// TODO Auto-generated method stub
      if(work.getTaskFinished())
      {
    	  work.setState(new RestState());
    	  work.writeProgram();
      }
      else
      {
    	  if(work.getHour()<21)
    	  {
    		  System.out.println("当前时间"+work.getHour()+"加班哦,疲惫之极");
    	  }
    	  else
    	  {
    		  work.setState(new SleepingState());
    		  work.writeProgram();
    	  }
      }
	}

}
</span>
7、RestState类

<span style="font-size:18px;">public class RestState extends State
{

	@Override
	public void writeProgram(Work work)
	{
		// TODO Auto-generated method stub
    System.out.println("当前时间"+work.getHour()+"下班回家了");
	}

}
</span>
8、SleepingState类
<span style="font-size:18px;">public class SleepingState extends State
{

	@Override
	public void writeProgram(Work work)
	{
		// TODO Auto-generated method stub
     System.out.println("当前时间"+work.getHour()+"不行了,睡着了");
	}

}</span>

9、Client类

<span style="font-size:18px;">public class Client
{
public static void main(String[] args)
{
	Work emergencyProjects=new Work();
	emergencyProjects.setHour(9);
	emergencyProjects.writeProgram();
	emergencyProjects.setHour(10);
	emergencyProjects.writeProgram();
	emergencyProjects.setHour(12);
	emergencyProjects.writeProgram();
	emergencyProjects.setHour(13);
	emergencyProjects.writeProgram();
	emergencyProjects.setHour(14);
	emergencyProjects.writeProgram();
	emergencyProjects.setHour(17);
	emergencyProjects.writeProgram();
	emergencyProjects.setTaskFinished(false);
	emergencyProjects.setHour(19);
	emergencyProjects.writeProgram();
	emergencyProjects.setHour(22);
	emergencyProjects.writeProgram();
 }
}
</span>

运行结果

状态模式的好处:

1)将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

2)状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。

状态模式的使用场景:

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

参考资料:程杰老师<大话程序设计>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值