简介:在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。使对象看起来好像修改了它的类内部实现。

使用场景: 1、行为随状态改变而改变的场景。 2、代码中包含大量与对象状态有关的条件语句。

优点: 1、枚举可能的状态,在枚举状态之前需要确定状态种类。 2、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 3、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。

缺点: 1、状态模式的使用必然会增加系统类和对象的个数。 2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

实现案例: 定义不同状态类(StatesA、StatesB、StatesC),在状态类中定义改变状态的动作changeStates(DoEnviroment   de),以及该状态下的具体行为实现doOpt()。在执行类DoEnviroment中声明状态属性state,以及属性的set、get方法,并定义行为方法doOpt( )

例如下:

public interface States {

	public void changeState(DoEnviroment de);
	
	public void doOpt();
}

public class StatesA implements States {

	@Override
	public void changeState(DoEnviroment de) {
		System.out.println("状态改变成A");
		de.setStates(this);
		
	}

	@Override
	public void doOpt() {
		System.out.println("StatesA状态下,执行的动作");
	}
}

public class StatesB implements States {

	@Override
	public void changeState(DoEnviroment de) {
		System.out.println("状态改变成B");
		de.setStates(this);
		
	}

	@Override
	public void doOpt() {
		System.out.println("StatesB状态下,执行的动作");
	}
}

public class StatesC implements States {

	@Override
	public void changeState(DoEnviroment de) {
		System.out.println("状态改变成C");
		de.setStates(this);
		
	}

	@Override
	public void doOpt() {
		System.out.println("StatesC状态下,执行的动作");
	}
}

public class DoEnviroment {

	private States state;
	
	
	public DoEnviroment() {
		super();
		state=null;
	}
	public void setStates(States state) {
		this.state=state;
	}
	public States getStates() {
		return state;
	}
	
	public void doOpt() {
		if(state!=null)
			state.doOpt();
	}
}

public class LastestC {

	public static void main(String [] params) {
		DoEnviroment de=new DoEnviroment();
		States sa=new StatesA();
		sa.changeState(de);//通过该动作,将状态变成A状态
		de.doOpt();//A状态下的行为
		States sb=new StatesB();
		sb.changeState(de);//通过该动作,将状态变成B状态
		de.doOpt();//B状态下的行为
		States sc=new StatesC();
		sc.changeState(de);//通过该动作,将状态变成C状态
		de.doOpt();//C状态下的行为
		
	}
}