详解JAVA 设计模式之状态模式

 更新时间:2020年06月29日 16:41:35   作者:菜鸟教程  
这篇文章主要介绍了JAVA 状态模式的的相关资料,文中讲解的非常细致,帮助大家更好的学习理解JAVA 设计模式,感兴趣的朋友可以了解下

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

介绍

意图:

允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

主要解决:

对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

何时使用:

代码中包含大量与对象状态有关的条件语句。

如何解决:

将各种具体的状态类抽象出来。

关键代码:

通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变实例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。

应用实例:

1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。

2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context)。

优点:

1、封装了转换规则。

2、枚举可能的状态,在枚举状态之前需要确定状态种类。

3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。

4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。

5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

缺点:

1、状态模式的使用必然会增加系统类和对象的个数。

2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

使用场景:

1、行为随状态改变而改变的场景。

2、条件、分支语句的代替者。

注意事项:

在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。

实现

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

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

步骤 1

创建一个接口。

public interface State {
  public void doAction(Context context);
}

步骤 2

创建实现接口的实体类。

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

步骤 3

创建 Context 类。

public class Context {
  private State state;
 
  public Context(){
   state = null;
  }
 
  public void setState(State state){
   this.state = state;   
  }
 
  public State getState(){
   return state;
  }
}

步骤 4

使用 Context 来查看当状态 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());
  }
}

步骤 5

执行程序,输出结果:

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

以上就是详解JAVA 设计模式之状态模式的详细内容,更多关于JAVA 状态模式的资料请关注脚本之家其它相关文章!

相关文章

  • Java 反射机制原理与用法详解

    Java 反射机制原理与用法详解

    这篇文章主要介绍了Java 反射机制原理与用法,结合实例形式详细分析了Java反射机制的相关概念、原理、基本使用方法及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Mybatis-plus foreach拼接字符串查询无数据返回问题

    Mybatis-plus foreach拼接字符串查询无数据返回问题

    这篇文章主要介绍了Mybatis-plus foreach拼接字符串查询无数据返回问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringCloud Config配置加密解密用法解析

    SpringCloud Config配置加密解密用法解析

    这篇文章主要介绍了SpringCloud Config配置加密解密用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • java实现基于SMTP发送邮件的方法

    java实现基于SMTP发送邮件的方法

    这篇文章主要介绍了java实现基于SMTP发送邮件的方法,实例分析了java基于SMTP服务发送邮件的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • Java数据结构之KMP算法详解以及代码实现

    Java数据结构之KMP算法详解以及代码实现

    KMP算法是一种改进的字符串匹配算法,核心是利用之前的匹配失败时留下的信息,选择最长匹配长度直接滑动,从而减少匹配次数。本文主要介绍了KMP算法的原理与实现,需要的可以参考一下
    2022-12-12
  • Java杂谈之重复代码是什么

    Java杂谈之重复代码是什么

    刚开始工作时,总有人开玩笑说,编程实际上就是 CV,调侃很多程序员写程序依靠的是复制粘贴。至今,很多初级甚至高级程序员写代码依旧是CV,就是把其他项目里的一段代码复制过来,稍加改动,然后,跑一下没有大问题就完事。这就是在给其他人挖坑
    2021-09-09
  • Spring配置文件的拆分和整合过程分析

    Spring配置文件的拆分和整合过程分析

    在实际应用里,随着应用规模的增加,系统中 Bean 数量也大量增加,导致配置文件非常庞大。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将Spring 配置文件分解成多个配置文件,感兴趣的朋友跟随小编一起看看吧
    2022-10-10
  • 关于Maven中pom.xml文件配置详解

    关于Maven中pom.xml文件配置详解

    pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率
    2025-01-01
  • SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置

    SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置

    这篇文章主要为大家介绍了SpringBoot2.7中WebSecurityConfigurerAdapter类过期应该如何配置,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • IDEA之项目run按钮为灰色,无法运行问题

    IDEA之项目run按钮为灰色,无法运行问题

    这篇文章主要介绍了IDEA之项目run按钮为灰色,无法运行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论