状态模式与备忘录模式(1)

简介: 状态模式与备忘录模式(1)

一、状态模式

状态模式( State Pattern ) 也称为状态机模式(State Machine Pattern), 是允许对象在内

部状态发生改变时改变它的行为,对象看起来好像修改了它的类,属于行为型模式。


原文:Allow an object to alter its behavior when its internal state changes. The object will appear to change its class.

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


状态模式中类的行为是由状态决定的,不同的状态下有不同的行为。其意图是让一个对象在

其内部改变的时候,其行为也随之改变。状态模式核心是状态与行为绑定,不同的状态对应不

同的行为。


二、状态模式应用场景

状态模式在生活场景中也还比较常见。例如:我们平时网购的订单状态变化。另外,我们平

时坐电梯,电梯的状态变化。


在软件开发过程中,对于某一项操作,可能存在不同的情况。通常处理多情况问题最直接的

方式就是使用if…else或 switch…case条件语句进行枚举。但是这种做法对于复杂状态的判断 天然存在弊端:条件判断语句过于臃肿,可读性差,且不具备扩展性,维护难度也大。而如果

转换思维,将这些不同状态独立起来用各个不同的类进行表示,系统处于哪种情况,直接使用

相应的状态类对象进行处理,消除了 if-else , switch…case等冗余语句,代码更有层次性且具

备良好扩展力。


状态模式主要解决的就是当控制一个对象状态的条件表达式过于复杂时的情况。通过把状态

的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。对象的行为依赖

于它的状态(属性),并且会根据它的状态改变而改变它的相关行为。状态模式适用于以下场景 :


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


2、 一个操作中含有庞大的多分支结构,并且这些分支取决于对象的状态。


首先来看下状态模式的通用UML类图:


image.png


从 UML类图中,我们可以看到,状态模式主要包含三种角色:

1、环境类角色(Context):定义客户端需要的接口,内部维护一个当前状态实例,并负责

具体状态的切换

2、抽象状态角色(State ):定义该状态下的行为,可以有一个或多个行为;

3、具体状态角色(ConcreteState ):具体实现该状态对应的行为,并且在需要的情况下进行状态切换。


步骤 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
目录
相关文章
|
JavaScript 前端开发 API
使用ArkUI封装表单
本文介绍了如何使用华为鸿蒙系统的声明式UI框架ArkUI封装表单。主要内容包括创建自定义组件、实现验证逻辑、在父组件中使用自定义表单组件,以及样式和布局的设置。通过这些步骤,可以提高代码的可复用性和模块化程度,使表单构建更加高效和易于维护。
422 3
|
弹性计算 运维 监控
阿里云云服务诊断工具评测-轻松实现云资源健康监控与故障排查
阿里云云服务诊断工具评测:作为一名开发工程师,我体验了其健康状态与诊断功能。健康状态功能可实时监控ECS实例运行状况,帮助快速发现异常;诊断功能则自动分析并提供解决方案,显著提升故障排查效率。通过这些功能,我的工作效率提升了约30%-40%。建议进一步增强智能诊断和优化界面显示,使工具更加强大易用。推荐给所有运维人员和开发工程师使用。
335 22
|
11月前
|
安全 Java Linux
Nexpose 8.1.0 for Linux & Windows - 漏洞扫描
Nexpose 8.1.0 for Linux & Windows - 漏洞扫描
116 4
Nexpose 8.1.0 for Linux & Windows - 漏洞扫描
|
Ubuntu Linux Go
docker容器启动报错
docker容器启动报错解决
|
DataWorks NoSQL Java
DataWorks操作报错合集之数据集成使用公共数据集成资源组写入到redis数据源(使用的是VPC连接),提示以下错误:request action:[InnerVpcGrantVpcInstanceAccessToApp], message:[InvalidInstanceId.怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
jenkins Java 持续交付
Jenkins - 默认用户名和密码及启动方法
Jenkins - 默认用户名和密码及启动方法
8253 0
|
机器学习/深度学习 存储 文字识别
模型精度不降反升!飞桨是这样改进PACT量化算法的!
模型精度不降反升!飞桨是这样改进PACT量化算法的!
612 0
|
Linux Perl
Linux命令小技巧:显示文件指定行的内容
Linux命令小技巧:显示文件指定行的内容
731 0
|
Java C++
List.of() Vs Arrays.asList()
在上面的示例中,List.of() 用于创建不可变的颜色列表。任何通过添加或删除元素来修改列表的尝试都将导致抛出异常。 Arrays.asList() 当我们想要由指定数组支持的固定大小(可序列化)集合时,请使用此方法。对返回集合的任何更改也将写入原始数组。 java
295 0
|
弹性计算
阿里云服务器续费优惠券和续费折扣来了
阿里云服务器续费代金券最高可领300元,云服务器ECS和轻量应用服务器续费均可享受优惠折扣
1273 0
阿里云服务器续费优惠券和续费折扣来了

热门文章

最新文章