一个应用程序在其生命周期里常会经历数个不同的状态,当处于不同状态时候,常需要表现不同的行为,因而需要设计不同的状态类别,以包含其会变的部分,以便表现不同的行为。
允许对象在其内部状态变化时改变其行为,对象看起来会改变其类。
例子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);
}
}
}