Java状态模式(State)

简介: 现实生活中我们经常会碰到状态改变的场景,面对不同的场景我们会做出不同的处理


 现实生活中我们经常会碰到状态改变的场景,面对不同的场景我们会做出不同的处理。比如:

电梯的运行

• 维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态

红绿灯

• 红灯、黄灯、绿灯

企业或政府系统

• 公文的审批状态

– 报销单据审批状态

– 假条审批

网上购物时,订单的状态

• 下单

• 已付款

• 已发货

• 送货中

• 已收货

image.png

状态模式

使用场景

 本案例我们通过宾馆入住的情况来演示,宾馆房间的状态有这么几个:已预订,已入住,空闲。如果不用状态模式我们的实现如下:

if(state=="空闲"){
  if(预订房间){
    预定操作;
    state="已预订";
  }else if(住进房间){
    入住操作;
    state="已入住";
  }
}else if(“已预订"){
  if(住进房间){
    入住操作;
    state="已入住";
  }else if(取消预订){
    取消操作;
    state="空闲";
  }
}

这种实现中if语句过多,不便于维护修改。这时我们可以考虑用状态模式来实现。

状态模式实现

类图结构

image.png

核心:

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

image.png

image.png

实现代码

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());
    ctx.setState(new BookedState());
  }
}

输出结果

修改状态!
房间空闲!!!没人住!
修改状态!
房间已预订!别人不能定!

开发中常见的场景:

   银行系统中账号状态的管理

   OA系统中公文状态的管理

   酒店系统中,房间状态的管理

   线程对象各状态之间的切换


相关文章
|
2天前
|
设计模式 Java 测试技术
Java设计模式-状态模式(18)
Java设计模式-状态模式(18)
|
1月前
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
4月前
|
设计模式 Java 开发者
Java设计模式【二十一】:状态模式
Java设计模式【二十一】:状态模式
49 0
|
4月前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
46 4
|
4月前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
11月前
|
Java 关系型数据库 MySQL
create connection error, url: jdbc:mysql://localhost:3306/ssm, errorCode 1045, state 28000 java.sql.
create connection error, url: jdbc:mysql://localhost:3306/ssm, errorCode 1045, state 28000 java.sql.
143 0
|
4月前
|
设计模式 Java
聊聊Java设计模式-状态模式
状态模式(State Pattern)指允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。
78 1
聊聊Java设计模式-状态模式
|
设计模式 Java
【设计模式】用Java实现状态模式
状态模式是一种行为设计模式,它允许对象在内部状态发生改变时改变其行为。该模式将对象的行为包装在不同的状态类中,使得对象的行为可以根据其当前状态动态改变。
184 0
|
11月前
|
设计模式 Java 开发者
【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)
【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)
76 0
|
设计模式 Java uml
Java中23种面试常考的设计模式之状态模式(State)---行为型模式
Java中23种面试常考的设计模式之状态模式(State)---行为型模式
95 1