Java设计模式之状态模式

状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作练习



状态模式适用于各个状态之间的切换场景模式下(状态切换判断)。--可用状态模式

判断的值与改变的状态无关(一般的状态判断

 用一句话来表述,状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。每种状态为一个类

 ●  环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。

  ●  抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。

  ●  具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。


以下为例子,红绿灯3种状态,当红灯时转换状态为绿灯,绿灯转为黄灯,黄灯转为红灯

package com.huawei.state;



/**
 *  State需要两种类型实体参与:
	state manager 状态管理器 ,就是开关 ,如上面例子的Context实际就是一个state manager, 在state manager中有对状态的切换动作.
	用抽象类或接口实现的父类,,不同状态就是继承这个父类的不同子类.
 * @author Administrator
 *
 */
public class Context {
	  private State state = null;
	  private String color = null;
	  public Context(State state,String color){
			this.state = state;
			this.color = color;

	 }
	  
	
	  public void change()
	  {
		  state.changeColor(this);
	  }
	  
	 
	public State getState() {
		return state;
	}


	public void setState(State state) {
		this.state = state;
	}


	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public static void main(String[] args) {
		Context c2 = new Context(new yellowClass(),"yellow");
		c2.change();
		System.out.println(c2.getColor());
		c2.change();
		System.out.println(c2.getColor());
		c2.change();
		System.out.println(c2.getColor());c2.change();
		System.out.println(c2.getColor());c2.change();
		System.out.println(c2.getColor());c2.change();
		System.out.println(c2.getColor());c2.change();
		/**
		 * 输出结果
		 */
//		red
//		green
//		yellow
//		red
//		green
//		yellow

		
		
		
	}
}
interface State{
	

	void changeColor(Context Context);
}
class GreenClass implements State
{
	
	@Override
	public void changeColor(Context Context) {
		// TODO Auto-generated method stub

		if(Context.getColor()!=null&&Context.getColor().equals("green"))
		{
			Context.setState(new yellowClass());
			Context.setColor("yellow");
		}
	}
	
	
}
class redClass implements State
{
	
	@Override
	public void changeColor(Context Context) {
		// TODO Auto-generated method stub

		if(Context.getColor()!=null&&Context.getColor().equals("red"))
		{
			Context.setState(new GreenClass());

			Context.setColor("green");

		}
	}
	
	
}
class yellowClass implements State
{
	
	@Override
	public void changeColor(Context Context) {
		// TODO Auto-generated method stub
		if(Context.getColor()!=null&&Context.getColor().equals("yellow"))
		{
			Context.setState(new redClass());

			Context.setColor("red");
		}
	}
	
	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值