欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 23种设计模式之状态模式

23种设计模式之状态模式

2025/2/21 3:16:36 来源:https://blog.csdn.net/weixin_51395608/article/details/144438362  浏览:    关键词:23种设计模式之状态模式

目录

  • 1. 简介
  • 2. 代码
    • 2.1 State (定义抽象状态接口)
    • 2.2 StartState (实现具体状态类)
    • 2.3 EndState (实现具体状态类)
    • 2.4 Context (定义上下文类)
    • 2.5 Test (测试类)
    • 2.6 运行结果
  • 3. 使用场景
  • 4. 优缺点
  • 5. 总结

1. 简介

状态模式(State Pattern) 是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。这种模式通过将对象的状态和行为解耦,使得状态的变化不会直接影响对象的行为,从而提高了代码的可读性和可维护性。

状态模式主要由三个角色组成:

  • 上下文(Context) :上下文类负责维护当前状态对象的引用,并提供对外接口,让客户端可以通过上下文与不同的状态对象进行交互。上下文类通常包含业务逻辑,这些逻辑会根据当前状态的不同而变化。
  • 抽象状态(State) :抽象状态类定义了所有具体状态类共有的方法。这个类可以是一个接口或抽象类,用于声明状态更新的操作方法有哪些,具体实现由子类完成。
  • 具体状态(Concrete State) :具体状态类继承抽象状态类,并实现具体状态下的行为逻辑。每个具体状态类对应一种状态的具体实现,处理与上下文相关的行为和状态转换。

2. 代码

2.1 State (定义抽象状态接口)

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

2.2 StartState (实现具体状态类)

public class StartState implements State{@Overridepublic void doAction(Context context){System.out.println("Player is in start state");context.setState(this);}public String toString(){return "Start State...";}
}

2.3 EndState (实现具体状态类)

public class EndState implements State{@Overridepublic void doAction(Context context){System.out.println("Player is in End State");context.setState(this);}public String toString(){return "End State...";}
}

2.4 Context (定义上下文类)

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

2.5 Test (测试类)

public class Test {public static void main(String[] args) {Context context = new Context();State state = new StartState();state.doAction(context);System.out.println(context.getState().toString());state = new EndState();state.doAction(context);System.out.println(context.getState().toString());}
}

2.6 运行结果

Player is in start state
Start State...
Player is in End State
End State...

3. 使用场景

几种场景:

对象的行为依赖于其状态:当一个对象的行为随着其内部状态的变化而变化时,可以使用状态模式。例如,在电子商务系统中,订单可能经历多种状态(如创建、支付、发货、完成和取消),每个状态下可以执行的操作不同,状态模式可以很好地管理这种状态的变化。

代码中包含大量的条件语句:当代码中包含大量的条件语句,并且这些条件语句表示对象的不同状态时,可以使用状态模式。状态模式可以将不同状态的处理分离出来,使得代码更加清晰。

对象的状态转换规则复杂:当对象的状态转换规则非常复杂时,可以使用状态模式。状态模式可以将状态转换规则封装在状态类中,使得状态转换更加灵活、可扩展。

需要增加新的状态:当需要增加新的状态时,可以使用状态模式。通过增加新的状态类,可以很容易地扩展状态模式。

对象具有多种状态且状态之间存在转换关系:当对象的行为随着其内部状态的变化而变化,并且这些状态之间存在复杂的转换逻辑时,状态模式非常有用。例如,在游戏编程中,可以根据游戏的不同阶段(如游戏开始、进行中、结束)来改变游戏逻辑。

并发编程中的线程状态管理:在并发编程中,可以根据线程的不同状态(如运行、等待、阻塞)来改变线程的行为。

图形用户界面(GUI)事件处理:在GUI开发中,可以根据用户界面的不同状态(如加载、成功、错误)来改变界面的行为。

银行系统中的账号状态管理:在银行系统中,可以根据账户的不同状态(如正常、冻结、注销)来管理账户的行为。

酒店系统中的房间状态管理:在酒店系统中,可以根据房间的不同状态(如已预订、已入住、空闲)来管理房间的使用情况。

TCP/IP网络连接中的状态管理:在TCP/IP网络连接中,可以根据连接的不同状态(如已建立、聆听、关闭)来处理不同的网络请求。

状态模式是一种非常实用的设计模式,它通过将对象的状态转换封装在状态类中,使得对象的状态转换更加灵活、可扩展,降低了对象的复杂度,提高了代码的可读性和可维护性。

4. 优缺点

优点:

  1. 结构清晰:状态模式将与特定状态相关的行为局部化到一个状态类中,使得代码结构更加清晰,易于理解和维护。
  2. 减少条件语句:通过使用状态模式,可以避免在代码中出现大量的条件判断语句(如switch-case或if-else),从而提高代码的可读性和简洁性。
  3. 符合开闭原则:状态模式允许在不修改现有代码的情况下添加新的状态,符合开闭原则,即对扩展开放,对修改关闭。
  4. 封装性好:状态的切换和行为变化被封装在类的内部实现,外部调用无需了解类内部如何实现状态和行为的变换。
  5. 易于扩展:增加新的状态只需增加新的状态类,而不需要修改现有代码,这使得系统具有良好的可维护性和可扩展性。
  6. 提高灵活性:状态模式支持动态地添加新的状态,无需修改现有代码,增强了系统的灵活性和可扩展性。

缺点:

  1. 类数量增加:每增加一种状态都需要创建一个新的状态类,这可能导致系统中类的数量显著增加,增加了系统的复杂性和管理难度。
  2. 复杂性增加:在一些简单的应用场景下,使用状态模式可能会引入不必要的复杂性,导致系统设计和代码维护的难度增加。
  3. 耦合性强:虽然状态模式将状态之间的行为分离,但状态之间的切换仍然存在一定的耦合关系,需要通过上下文类来进行状态的切换,可能会影响系统的灵活性。
  4. 过度设计:如果状态数量较少或状态转换逻辑简单,则使用状态模式可能会被认为是过度设计,反而降低代码的可读性。

5. 总结

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词