码迷,mamicode.com
首页 > 其他好文 > 详细

状态模式

时间:2016-08-03 09:03:37      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

定义:当一个对象内在状态的改变时允许其改变行为,这个对象看起来像改变了其类

类图:

技术分享


代码:

public abstract class State {

	protected Context context;
	
	public void setContext(Context context){
		this.context = context;
	}
	
	public abstract void handle1();
	
	public abstract void handle2();
}
public class ConcreteState1 extends State{

	@Override
	public void handle1() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void handle2() {
		// TODO Auto-generated method stub
		super.context.setCurrentState(Context.STATE2);
		super.context.handle2();
	}

}
public class ConcreteState2 extends State{

	@Override
	public void handle1() {
		// TODO Auto-generated method stub
		super.context.setCurrentState(Context.STATE1);
		super.context.handle1();
	}

	@Override
	public void handle2() {
		// TODO Auto-generated method stub
		
	}

}
public class Context {
  public static final State STATE1 = new ConcreteState1();
  public static final State STATE2 = new ConcreteState2();
  
  private State currentState;
  
  public  State getCurrentState(){
	  return currentState;
  }
  
  public void setCurrentState(State currentState){
	  this.currentState = currentState;
	  this.currentState.setContext(this);
  }
  
  public void handle1(){
	  this.currentState.handle1();
  }
  
  public void handle2(){
	  this.currentState.handle2();
  }
  
}
public class Client {

	public static void main(String[] args){
	
		Context context = new Context();
		context.setCurrentState(new ConcreteState1());
		context.handle1();
		context.handle2();
	}
}
State抽象状态角色

负责对象状态定义。并且封装环境角色以实现状态切换

ConcreteState具体状态角色

每个具体状态角色必须完成两个职责:本状态的行为管理以及趋向状态处理(本状态要做的事,以及本状态如何过度到状态)

Context环境角色

定义客户端需要的接口,并且负责具体状态的切换


优点:

结构清晰

遵循设计原则

封装性好


缺点:

类的膨胀


使用场景

1.行为随着状态的改变而改变

2.条件,分支判断语句的替换


注意:状态模式适用于当某个对象在它的状态发生改变时,它的行为也随着发生比较大的变化,也就是说在行为受状态约束的情况下可以使用状态模式,而且使用的对象的状态最好不要超过5个





状态模式

标签:

原文地址:http://blog.csdn.net/renpengddxx/article/details/52100081

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!