Java设计模式-状态模式State

本文介绍了状态模式的概念、原理类图及应用场景。通过一个实战案例详细展示了如何利用状态模式解决对象在不同状态下表现出不同行为的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

介绍

  1. 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为是一一对应的,状态之间可以相互转换。
  2. 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

原理类图

在这里插入图片描述

  • 对原理类图的说明-即(状态模式的角色及职责):
  1. Context 类为环境角色, 用于维护 State 实例,这个实例定义当前状态
  2. State 是抽象状态角色,定义一个接口封装与 Context 的一个特点接口相关行为
  3. ConcreteState 具体的状态角色,每个子类实现一个与 Context 的一个状态相关行为

实战案例

我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。

StatePatternDemo,我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化。

在这里插入图片描述

代码实现

public interface State {
   public void doAction(Context context);
}
public class StartState implements State {
 
   public void doAction(Context context) {
      System.out.println("Player is in start state");
      context.setState(this); 
   }
 
   public String toString(){
      return "Start State";
   }
}
public class StopState implements State {
 
   public void doAction(Context context) {
      System.out.println("Player is in stop state");
      context.setState(this); 
   }
 
   public String toString(){
      return "Stop State";
   }
}
public class Context {
   private State state;
 
   public Context(){
      state = null;
   }
 
   public void setState(State state){
      this.state = state;     
   }
 
   public State getState(){
      return state;
   }
}
public class StatePatternDemo {
   public static void main(String[] args) {
      Context context = new Context();
 
      StartState startState = new StartState();
      startState.doAction(context);
 
      System.out.println(context.getState().toString());
 
      StopState stopState = new StopState();
      stopState.doAction(context);
 
      System.out.println(context.getState().toString());
   }
}
  • 输出:
Player is in start state
Start State
Player is in stop state
Stop State

注意事项

  1. 代码有很强的可读性。状态模式将每个状态的行为封装到对应的一个类中。
  2. 方便维护。将容易产生问题的 if-else 语句删除了,如果把每个状态的行为都放到一个类中,每次调用方法时都要判断当前是什么状态,不但会产出很多 if-else 语句,而且容易出错。
  3. 符合“开闭原则”。容易增删状态
  4. 会产生很多类。每个状态都要一个对应的类,当状态过多时会产生很多类,加大维护难度
  5. 应用场景:当一个事件或者对象有很多种状态,状态之间会相互转换,对不同的状态要求有不同的行为的时候,可以考虑使用状态模式。
<think>好的,我现在需要回答用户关于Java状态模式的设计与实现的问题,并且根据提供的引用内容来支持回答。首先,我要确保理解状态模式的基本概念和应用场景。 用户提供的引用中,状态模式被定义为一种行为型设计模式,允许对象在内部态改变时改变其行为,而无需修改其代码。引用[2]提到状态模式通过将行为封装到不同的态类中,使对象在不同态下有不同的行为。引用[4]也指出,状态模式在对象内部态改变时改变其行为,并将行为封装在不同的态对象中。这些信息帮助我确认状态模式的核心思想是态与行为的分离。 接下来,用户需要具体的Java示例。引用[3]提到了订单态的处理,这可能是一个典型的应用场景,比如电商系统中的订单态机。结合引用[1]中的电子商务项目实例,我可以设计一个订单态的例子,展示不同态下的行为变化。 我需要构建一个结构清晰的示例,包括上下文类(Context)和具体的态类。根据引用中的信息,状态模式的结构通常包含一个抽象态接口或抽象类,具体态类实现该接口,上下文类持有当前态并委托行为给态对象。 此外,要确保代码符合Java规范,使用合适的设计,比如将态转换逻辑放在具体态类中,或者由上下文类管理态转换。根据引用[3]中的态机业务实现,可能态转换由态类自身触发,比如处理完一个操作后切换到下一个态。 在编写示例时,需要注意态之间的转换条件和行为。例如,订单从“待支付”变为“已支付”,再变为“已发货”等。每个态处理的操作(如支付、发货)会导致态变更,这需要在具体态类中实现。 最后,根据用户提供的引用内容,我需要正确标注引用来源。例如,在解释状态模式定义时引用[2]和[4],在提到电商应用时引用[1]和[3]。 现在,我需要将这些思路整合成一个结构清晰的回答,包含定义、结构、实现步骤、示例代码和应用场景,并在适当位置添加引用标注。同时,生成相关问题以帮助用户进一步理解。</think>### Java 状态模式的设计与实现 #### 1. 定义与核心思想 状态模式State Pattern)是一种行为型设计模式,允许对象在内部态改变时改变其行为。其核心是将**对象的行为封装到不同的态类**中,通过切换态对象实现行为的动态调整,避免大量条件判断语句[^2][^4]。 #### 2. 模式结构 - **上下文类(Context)**:持有当前态对象,定义客户端调用的接口。 - **抽象态类(State)**:定义态行为的接口。 - **具体态类(ConcreteState)**:实现抽象态类的行为逻辑,可能触发态转换。 #### 3. 实现步骤(以电商订单态为例) ##### 步骤1:定义态接口 ```java public interface OrderState { void pay(OrderContext context); // 支付操作 void ship(OrderContext context); // 发货操作 } ``` ##### 步骤2:实现具体态类 - **待支付态** ```java public class UnpaidState implements OrderState { @Override public void pay(OrderContext context) { System.out.println("支付成功"); context.setState(new PaidState()); // 态切换 } @Override public void ship(OrderContext context) { System.out.println("错误:尚未支付,无法发货"); } } ``` - **已支付态** ```java public class PaidState implements OrderState { @Override public void pay(OrderContext context) { System.out.println("错误:订单已支付"); } @Override public void ship(OrderContext context) { System.out.println("发货成功"); context.setState(new ShippedState()); // 态切换 } } ``` ##### 步骤3:定义上下文类 ```java public class OrderContext { private OrderState currentState; public OrderContext() { this.currentState = new UnpaidState(); // 初始态 } public void setState(OrderState state) { this.currentState = state; } public void pay() { currentState.pay(this); // 委托给当前态 } public void ship() { currentState.ship(this); } } ``` #### 4. 使用示例 ```java public class Client { public static void main(String[] args) { OrderContext order = new OrderContext(); order.ship(); // 输出:错误:尚未支付,无法发货 order.pay(); // 输出:支付成功 order.ship(); // 输出:发货成功 } } ``` #### 5. 应用场景 - **订单态流转**:如电商系统中订单的“待支付→已支付→已发货”流程[^3]。 - **游戏角色态**:角色“站立→移动→攻击”态切换。 - **硬件设备控制**:打印机“空闲→打印→缺纸”态管理。 #### 6. 优势与注意事项 - **优势**:消除复杂条件分支、符合开闭原则、态转换逻辑集中管理[^1][^2]。 - **注意事项**:避免态类膨胀(需合理拆分粒度)、上下文类与态类的职责边界需清晰。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值