java-NIO之API(3)- GoF之状态模式
2020-09-26 本文已影响0人
卡门001
GoF-状态模式(State pattern)
状态模式定义
所谓的状态模式,指的是对于同一个对象而言,不同的状态对应着不同的行为,同时,这些状态和行为之间是可以转化的,由一个状态转向另外的一个状态。
- 允许一个对象在其内部状态改变时改变它的行为,对象看起来是修改了它的类。
- 主要用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。
比如交通红绿灯的三个状态,同一个对象对应着不同的状态,不同的状态又表示的是不同的行为:
- 红灯:表示的是不可以通过
- 黄灯:表示的是警告
- 绿灯:表示的是可以通行。
本质
根据状态来分离和选择行为。
结构
- Context 环境类: 环境类中维护一个 State 对象,它定义了当前的状态。
- State 抽象状态类
- ConcreteState 具体状态类:每一个类封装了一个状态对应的行为
示例
酒店系统中,房间的状态变化:
- 空闲状态
- 已预订状态
- 已入住状态

代码
接口类 State
/**
* 状态接口,封装与Context的一个特定状态相关的行为
*/
public interface State {
/**
* 状态对象的处理
* @param sampleParameter 示例参数,说明可以传入什么样的参数、传入几个由具体应用具体分析
*/
void handle();
}
实现类-房间空闲状态 FreeState
/**
* 实现一个与Context的一个特定状态相关的行为
* 房间空闲状态
*
*/
public class FreeState implements State {
@Override
public void handle() {
//实现具体的处理(下同)
System.out.println("房间空闲,可以预定!");
}
}
实现类-房间预定状态 BookedState
/**
* 房间预定状态
*/
public class BookedState implements State {
@Override
public void handle() {
System.out.println("房间已预订,可以入住!");
}
}
实现类-房间已入住状态 CheckedInState
/**
* 房间已入住状态
*/
public class CheckedInState implements State {
@Override
public void handle() {
System.out.println("房间已入住,不能预定!");
}
}
测试
/**
* 测试状态模式
* @author CL
*
*/
public class Client {
public static void main(String[] args) {
HomeContext hc = new HomeContext();
//修改为空闲状态
hc.setState(new FreeState());
//修改为已预订状态
hc.setState(new BookedState());
//修改为已入住状态
hc.setState(new CheckedInState());
}
}
控制台输出
修改状态:房间空闲,可以预定!
修改状态:房间已预订,可以入住!
修改状态:房间已入住,不能预定!
参考
https://www.jianshu.com/p/4ad18e646d15
https://www.cnblogs.com/cao-lei/p/8334305.html