状态模式

打印 上一主题 下一主题

主题 975|帖子 975|积分 2925

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在软件开辟过程中,我们经常会碰到这样的情况:一个对象的行为会随着其内部状态的改变而发生变化。例如,一个手机在差别状态下(开机、关机、静音等)对类似的操作(如来电)会有差别的反应。传统的解决方案可能会利用大量的条件判断语句(如 if - else 或 switch - case)来处理差别状态下的行为,但这种方式会使代码变得痴肥、难以维护和扩展。状态模式(State Pattern)应运而生,它提供了一种优雅的方式来处理对象状态变化及其对应的行为变化。

状态模式概述

状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,就好像对象修改了它的类一样。状态模式主要包含以下几个角色:

  • 情况类(Context):也称为上下文,它持有一个状态对象的引用,界说了客户端感兴趣的接口,并将与状态相关的操作委托给当前的状态对象来处理。
  • 抽象状态类(State):界说了一个接口,用于封装与情况类的一个特定状态相关的行为。
  • 详细状态类(ConcreteState):实现抽象状态类中界说的接口,每个详细状态类对应情况类的一个详细状态,实现该状态下的详细行为。

状态模式代码示例

以下是利用 Java 语言实现状态模式的示例代码。以一个简朴的电梯控制体系为例,电梯有 “运行”、“制止” 两种状态,并且在差别状态下对 “开门”、“关门” 操作有差别的响应。
  1. // 抽象状态类
  2. abstract class LiftState {
  3.     protected LiftContext liftContext;
  4.     public void setLiftContext(LiftContext liftContext) {
  5.         this.liftContext = liftContext;
  6.     }
  7.     public abstract void open();
  8.     public abstract void close();
  9.     public abstract void run();
  10.     public abstract void stop();
  11. }
  12. // 运行状态类
  13. class RunningState extends LiftState {
  14.     @Override
  15.     public void open() {
  16.         System.out.println("电梯正在运行,无法开门");
  17.     }
  18.     @Override
  19.     public void close() {
  20.         System.out.println("电梯正在运行,门已关闭");
  21.     }
  22.     @Override
  23.     public void run() {
  24.         System.out.println("电梯正在运行");
  25.     }
  26.     @Override
  27.     public void stop() {
  28.         System.out.println("电梯停止运行");
  29.         liftContext.setState(liftContext.getStoppedState());
  30.     }
  31. }
  32. // 停止状态类
  33. class StoppedState extends LiftState {
  34.     @Override
  35.     public void open() {
  36.         System.out.println("电梯停止,门打开");
  37.     }
  38.     @Override
  39.     public void close() {
  40.         System.out.println("电梯停止,门关闭");
  41.         liftContext.setState(liftContext.getRunningState());
  42.     }
  43.     @Override
  44.     public void run() {
  45.         System.out.println("电梯开始运行");
  46.         liftContext.setState(liftContext.getRunningState());
  47.     }
  48.     @Override
  49.     public void stop() {
  50.         System.out.println("电梯已停止");
  51.     }
  52. }
  53. // 环境类
  54. class LiftContext {
  55.     private LiftState state;
  56.     private RunningState runningState = new RunningState();
  57.     private StoppedState stoppedState = new StoppedState();
  58.     public LiftContext() {
  59.         this.state = stoppedState;
  60.         runningState.setLiftContext(this);
  61.         stoppedState.setLiftContext(this);
  62.     }
  63.     public void setState(LiftState state) {
  64.         this.state = state;
  65.     }
  66.     public RunningState getRunningState() {
  67.         return runningState;
  68.     }
  69.     public StoppedState getStoppedState() {
  70.         return stoppedState;
  71.     }
  72.     public void open() {
  73.         state.open();
  74.     }
  75.     public void close() {
  76.         state.close();
  77.     }
  78.     public void run() {
  79.         state.run();
  80.     }
  81.     public void stop() {
  82.         state.stop();
  83.     }
  84. }
  85. public class StatePatternDemo {
  86.     public static void main(String[] args) {
  87.         LiftContext liftContext = new LiftContext();
  88.         liftContext.open();
  89.         liftContext.close();
  90.         liftContext.run();
  91.         liftContext.stop();
  92.         liftContext.open();
  93.     }
  94. }
复制代码
在上述代码中,LiftState 是抽象状态类,界说了电梯在差别状态下可执行的操作接口。RunningState 和 StoppedState 是详细状态类,分别实现了电梯在 “运行” 和 “制止” 状态下的详细行为。LiftContext 是情况类,持有当前电梯的状态,并将对电梯的操作委托给当前状态对象。在 main 方法中,我们模拟了电梯的一系列操作,展示了状态模式下电梯在差别状态下的行为变化。

状态模式的应用场景


  • 游戏开辟:游戏角色在差别状态下(如站立、奔跑、跳跃、受伤等)对用户输入(如按键操作)会有差别的反应。通过状态模式,可以将差别状态下的行为封装在各自的详细状态类中,使代码结构更加清晰,易于维护和扩展。
  • 工作流体系:在工作流体系中,任务可能处于差别的状态(如待处理、处理中、已完成等),并且在差别状态下对各种操作(如分配任务、提交任务等)有差别的处理方式。状态模式可以很好地处理这种情况,将工作流的状态管理和行为处理分离。
  • 装备状态管理:对于各种装备(如打印机、空调等),它们在差别状态下(如开启、关闭、故障等)对用户操作(如打印指令、温度调治等)的响应差别。利用状态模式可以方便地实现装备状态的管理和相应行为的处理。

状态模式的优缺点


  • 长处

    • 清晰的状态管理:状态模式将对象的状态和行为封装在差别的详细状态类中,使得代码结构更加清晰,易于理解和维护。每个状态类专注于实现该状态下的特定行为,符合单一职责原则。
    • 易于扩展:当需要添加新的状态或修改现有状态的行为时,只需要创建新的详细状态类或修改现有状态类的代码,而不需要在大量的条件判断语句中举行修改,符合开闭原则。
    • 提高可维护性:避免了利用大量的条件判断语句,使得代码更加轻便,淘汰了堕落的可能性。同时,当状态变化时,只需要修改相应状态类的代码,而不会影响其他状态的行为。

  • 缺点

    • 增加类的数量:由于每个状态都需要一个详细的状态类来实现,可能会导致类的数量增加,使项目的代码结构变得复杂。在小型项目中,这种复杂性可能会显得过于冗余。
    • 状态转换逻辑复杂:在一些复杂的应用场景中,状态之间的转换逻辑可能会变得复杂,需要仔细设计和维护状态转换的条件温顺序,否则可能会导致状态转换错误或不符合预期的行为。


结语

希望本文能帮助您更好地理解状态模式的概念及实在际应用。如果您有任何疑问或发起,请随时留言交换。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表