八、状态模式State(行为型模式)

一个应用程序在其生命周期里常会经历数个不同的状态,当处于不同状态时候,常需要表现不同的行为,因而需要设计不同的状态类别,以包含其会变的部分,以便表现不同的行为。


允许对象在其内部状态变化时改变其行为,对象看起来会改变其类。

例子1:一个MM在她高兴与不高兴时候她的行为是不一样的:

abstract class MMState{

   public abstract void smile();

   public abstract void cry();

   public abstract void say();

}
class HappyState extends MMState{

   @Override

   public void smile() {

   }

   @Override

   public void cry() {

   }

   @Override

   public void say() {

   }

}
class UnHappyState extends MMState{

   @Override

   publicvoid smile() {

   }

   @Override

   publicvoid cry() {

   }

   @Override

   publicvoid say() { 

   }

}
class MM {

   String name;

   private MMState state=new HappyState();

   public String getName() {

      return name;

   } 

   public void setName(String name) {

      this.name = name;

   }

   public void smile(){

      state.smile();

   }

   public void cry(){

      state.cry();

   }

   public void say(){

      state.say();

   }

}

例子2:假设现在有一个开关,控制三种颜色的切换,blue,green,red,蓝色下一个绿色,绿色下一个红色,红色下一个是蓝色,也可以倒过来 。

/*
 * 状态操作接口,执行上一个下一个的操作,还可以获得当前的状态
 * 当然在这可以既执行别的操作,比如开关拨到某个颜色的时候,颜色对应的灯亮
 */

public interface State {
	public  void last(Context c);
	public  void next(Context c);
	public  String getState();
}

蓝色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中: 设置改变后的状态

public class BlueState implements State {

	public String getState() {
		// TODO Auto-generated method stub
		return "blue";
	}

	public void last(Context c) {
		c.setState(new GreenState());

	}

	public void next(Context c) {
		c.setState(new RedState());
	}
}

绿色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中 :设置改变后的状态

public class GreenState implements State {

	public String getState() {
		
		return "green";
	}

	public void last(Context c) {
		c.setState(new RedState());

	}

	public void next(Context c) {
	c.setState(new BlueState());

	}

}

红色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中  设置改变后的状态

public class RedState implements State {

	public String getState() {
		return "red";
	}

	public void last(Context c) {
	c.setState(new BlueState());

	}

	public void next(Context c) {
		c.setState(new GreenState());

	}

}

状态管理器,设置初始状态,得到当前状态, 

 提供了两个操作,上一个的操作方法中,调用了当前状态的last方法,将状态管理器的状态更新            

 下一个的操作方法中,调用了当前状态的next方法,将状态管理器的状态更新

public class Context {
	
	private State state = null;

	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}
	
	public void push(){
		
		state.last(this);
		System.out.println(state.getState());
	}
	
	public void pull(){
		
		state.next(this);
		System.out.println(state.getState());
	}
	

}
测试
public class Test {

	public static void main(String[] args) throws InterruptedException {
		/*
		 * 创建一个状态管理器,设置初始状态为红色,
		 * 然后就可以执行状态管理器的last或者next方法
		 */
		Context c = new Context();
		State redsState = new RedState();		
		c.setState(redsState);
			while (true){
				System.out.println("当前状态:"+c.getState().getState());
				System.out.print("上一个状态: ");
				 c.push();
				 Thread.currentThread().sleep(2000);
			}		 
	}
	
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值