掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

设计模式之状态模式详解(定义、优缺点、应用场景、实例类图)

在状态模式(State Pattern)中,类的行为是基于它的状态改变的,这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。状态模式允许对象在内部状态改变时改变其行为,使得对象在不同的状态下有不同的行为表现。通过将每个状态封装成独立的类,可以避免使用大量的条件语句来实现状态切换。

一、状态模式的介绍

意图

允许一个对象在其内部状态改变时改变其行为,看起来就像是改变了其类一样。

主要解决的问题

状态模式解决对象行为依赖于其状态的问题,使得对象可以在状态变化时切换行为。

使用场景

当代码中存在大量条件语句,且这些条件语句依赖于对象的状态时。

实现方式

  1. 定义状态接口:声明一个或多个方法,用于封装具体状态的行为。

  2. 创建具体状态类:实现状态接口,根据状态的不同实现具体的行为。

  3. 定义上下文类:包含一个状态对象的引用,并在状态改变时更新其行为。

关键代码

  1. 状态接口:声明行为方法。

  2. 具体状态类:实现状态接口,封装具体行为。

  3. 上下文类:维护一个状态对象,并提供方法以改变其状态。

结构

状态模式包含以下几个主要角色:

  1. 上下文(Context):定义了客户感兴趣的接口,并维护一个当前状态对象的引用。上下文可以通过状态对象来委托处理状态相关的行为。

  2. 状态(State):定义了一个接口,用于封装与上下文相关的一个状态的行为。

  3. 具体状态(Concrete State):实现了状态接口,负责处理与该状态相关的行为。具体状态对象通常会在内部维护一个对上下文对象的引用,以便根据不同的条件切换到不同的状态。

应用实例

  1. 篮球运动员状态:运动员可以有正常、不正常和超常等状态。

  2. 曾侯乙编钟:编钟作为上下文,不同的钟(状态)有不同的演奏效果。

二、状态模式的优缺点

优点

  1. 封装状态转换规则:将状态转换逻辑封装在状态对象内部。

  2. 易于扩展:增加新的状态类不会影响现有代码。

  3. 集中状态相关行为:将所有与特定状态相关的行为集中到一个类中。

  4. 简化条件语句:避免使用大量的条件语句来切换行为。

  5. 状态共享:允许多个上下文对象共享同一个状态对象。

缺点

  1. 增加类和对象数量:每个状态都需要一个具体的状态类。

  2. 实现复杂:模式结构和实现相对复杂。

  3. 开闭原则支持不足:增加新状态或修改状态行为可能需要修改现有代码。

三、状态模式的使用建议

  1. 当对象的行为随状态改变而变化时,考虑使用状态模式。

  2. 状态模式适用于替代复杂的条件或分支语句。

  3. 状态模式适用于状态数量有限(通常不超过5个)的情况。

  4. 谨慎使用,以避免系统变得过于复杂。

四、状态模式的实现

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

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

状态模式

  1. 步骤 1:创建一个接口。

State.java

public interface State {
   public void doAction(Context context);
}
  1. 步骤 2:创建实现接口的实体类。

StartState.java

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";
   }
}

StopState.java

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";
   }
}
  1. 步骤 3:创建 Context 类。

Context.java

public class Context {
   private State state;
 
   public Context(){
      state = null;
   }
 
   public void setState(State state){
      this.state = state;     
   }
 
   public State getState(){
      return state;
   }
}
  1. 步骤 4:使用 Context 来查看当状态 State 改变时的行为变化。

StatePatternDemo.java

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());
   }
}
  1. 步骤 5:执行程序,输出结果:

Player is in start state
Start State
Player is in stop state
Stop State

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • AI文本审核服务

    基于大模型能力构建的文本审核服务,能够高效精准地识别各类文本违规内容。与传统文本内容安全审核方案相比,具备更强大的语言理解与分析能力,能精准识别复杂、隐晦的违规内容,突破了传统模式的局限。

    基于大模型能力构建的文本审核服务,能够高效精准地识别各类文本违规内容。与传统文本内容安全审核方案相比,具备更强大的语言理解与分析能力,能精准识别复杂、隐晦的违规内容,突破了传统模式的局限。

  • AI图片审核服务

    基于图片审核大模型服务,能够全方位识别图片中的色情、性感、涉政、暴恐、违禁、宗教、引流广告、不良等违规内容,并支持返回大模型的审核结果。结合大模型和专家小模型,提供更细粒度的标签(如色情细分、具体行为、特定物体等),识别范围更广、标签更丰富。 综合效果最佳,适合对误判率、漏判率都有较高要求的场景。

    基于图片审核大模型服务,能够全方位识别图片中的色情、性感、涉政、暴恐、违禁、宗教、引流广告、不良等违规内容,并支持返回大模型的审核结果。结合大模型和专家小模型,提供更细粒度的标签(如色情细分、具体行为、特定物体等),识别范围更广、标签更丰富。 综合效果最佳,适合对误判率、漏判率都有较高要求的场景。

  • AIGC图片风险检测

    针对AIGC场景,检测AIGC生成的图片是否存在违规或者不宜传播的内容。建议AIGC生成的图片都进行该项检测。

    针对AIGC场景,检测AIGC生成的图片是否存在违规或者不宜传播的内容。建议AIGC生成的图片都进行该项检测。

  • AI生成图片鉴别

    检测图片是否疑似由AI生成合成、图片是否含有AI生成合成隐式标识(如果有隐式标识时支持返回图片AIGC元数据信息)。

    检测图片是否疑似由AI生成合成、图片是否含有AI生成合成隐式标识(如果有隐式标识时支持返回图片AIGC元数据信息)。

  • 诈骗风险感知检测

    根据身份证/手机号进行核验号码是否有涉险诈骗风险。

    根据身份证/手机号进行核验号码是否有涉险诈骗风险。

0512-88869195
客服微信二维码

微信扫码,咨询客服

数 据 驱 动 未 来
Data Drives The Future