状态模式核心

用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题


状态模式结构

  • Context环境类: 环境类中维护一个State对象,他是定义了当前的状态
  • State抽象状态类或接口
  • ConcreteState具体状态类: 每一个类封装了一个状态对应的行为




实例场景

酒店系统中,房间的状态变化

  • 已预订
  • 已入住
  • 空闲






State接口:IState.java

package 设计模式.状态模式.状态;

public interface IState {
void handle();
}


已预订状态:BookedState.java

package 设计模式.状态模式.状态;

/**
* 已预订状态
*
* @author 陈霓清
*/
public class BookedState implements IState {

@Override
public void handle() {
System.out.println("房间已预订!别人不能定!");
}

}


已入住状态:CheckedInState.java

package 设计模式.状态模式.状态;

/**
* 已入住状态
*
* @author 陈霓清
*/
public class CheckedInState implements IState {

@Override
public void handle() {
System.out.println("房间已入住!请勿打扰!");
}

}


空闲状态:FreeState.java

package 设计模式.状态模式.状态;

/**
* 空闲状态
*
* @author 陈霓清
*/
public class FreeState implements IState {

@Override
public void handle() {
System.out.println("房间空闲!!!没人住!");
}

}


房间对象:roomContext.java

package 设计模式.状态模式;

import 设计模式.状态模式.状态.IState;

/**
* 房间对象
* 如果是银行系统,这个Context类就是账号。根据金额不同,切换不同的状态!
*
* @author 陈霓清
*/
public class roomContext {
private IState state;

public void setState(IState s) {
System.out.println("修改状态!");
state = s;
state.handle();
}

}


客户端调用:Client.java
package 设计模式.状态模式;

import 设计模式.状态模式.状态.BookedState;
import 设计模式.状态模式.状态.FreeState;

public class Client {

public static void main(String[] args) {
roomContext ctx = new roomContext();

ctx.setState(new FreeState());
ctx.setState(new BookedState());

}
}


回到顶部