Java 状态模式 (State),马哥 linux2020 全套视频下载
if(住进房间){
入住操作;
state="已入住";
}else if(取消预订){
取消操作;
state="空闲";
}
}
这种实现中 if 语句过多,不便于维护修改。这时我们可以考虑用状态模式来实现。
现
类图结构
核心:
用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
| 角色 | 说明 |
| --- | :-- |
| Context 环境类 | 环境类中维护一个 State 对象,他是定义了当前的状态。 |
| State | 具体状态类 |
| ConcreteState 具体状态类 | 每一个类封装了一个状态对应的行为 |
实现代码
State
/**
State 接口
@author 波波烤鸭
@email dengpbs@163.com
*/
public interface State {
void handle();
}
State 实现类
/**
已预订状态
@author 波波烤鸭
@email dengpbs@163.com
*/
public class BookedState implements State {
@Override
public void handle() {
System.out.println("房间已预订!别人不能定!");
}
}
/**
已入住状态
@author 波波烤鸭
@email dengpbs@163.com
*/
public class CheckedInState implements State {
@Override
public void handle() {
System.out.println("房间已入住!请勿打扰!");
}
}
/**
空闲状态
@author 波波烤鸭
@email dengpbs@163.com
*/
public class FreeState implements State {
@Override
public void handle() {
System.out.println("房间空闲!!!没人住!");
}
}
房间对象
/**
房间对象
@author 波波烤鸭
@email dengpbs@163.com
*/
public class HomeContext {
//如果是银行系统,这个 Context 类就是账号。根据金额不同,切换不同的状态!
private State state;
public void setState(State s){
System.out.println("修改状态!");
state = s;
state.handle();
}
}
client
public class Client {
public static void main(String[] args) {
// 获取房间对象
HomeContext ctx = new HomeContext();
// 设置房间状态
ctx.setState(new FreeState());
评论