状态模式(State)
状态模式:用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。
角色构成:
Context:环境类,环境类中维护一个State对象,他是定义当前的状态。处理一些请求,这些请求最终产生的响应会与状态相关。
State:抽象状态类,它定义了每一个状态的行为集合,这些行为会在Context中得以使用。
ConcreteState:具体状态,实现相关行为的具体状态类。
状态模式所解决的问题:
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
Context
package com.kevin.行为型模式.状态模式.state;
/**
* @author kevin
* @version 1.0
* @description 房间状态,当切换不同状态时会切换不同状态下的不同行为
* 上下文
* @createDate 2019/3/4
*/
// 环境类
public class Context {
// 如果是银行系统,这个Context类就是账号,根据金额不同,切换不同的状态
private State state; // 房间状态
public void setState(State state) {
System.out.println("修改状态");
this.state = state;
state.handle();
}
public static void main(String[] args) {
}
}
State
package com.kevin.行为型模式.状态模式.state;
/**
* @author kevin
* @version 1.0
* @description 状态接口类
* @createDate 2019/3/4
*/
public interface State {
void handle();
}
ConcreteState
package com.kevin.行为型模式.状态模式.state;
/**
* @author kevin
* @version 1.0
* @description 具体状态,预订状态
* @createDate 2019/3/4
*/
public class BookedState implements State{
@Override
public void handle() {
System.out.println("房间已预订,别人不能订!");
}
}
package com.kevin.行为型模式.状态模式.state;
/**
* @author kevin
* @version 1.0
* @description 具体状态,已入住状态
* @createDate 2019/3/4
*/
public class CheckedInState implements State{
@Override
public void handle() {
System.out.println("房间已入住,请勿打扰!");
}
}
package com.kevin.行为型模式.状态模式.state;
/**
* @author kevin
* @version 1.0
* @description 具体状态,空闲状态
* @createDate 2019/3/4
*/
public class FreeState implements State{
@Override
public void handle() {
System.out.println("房间空闲,没人住!");
}
}
测试状态模式
package com.kevin.行为型模式.状态模式.state;
/**
* @author kevin
* @version 1.0
* @description 测试状态模式
* @createDate 2019/1/18
*/
public class Test {
public static void main(String[] args) {
Context ctx = new Context();
ctx.setState(new FreeState());
ctx.setState(new BookedState());
}
}
状态模式UML类图
开发中常见的场景
- 银行系统中账号状态的管理
- OA系统中公文状态的管理
- 酒店系统中,房间状态的管理
- 线程对象各状态之间的切换