状态设计模式(State Pattern)[论点:概念、相关角色、图示、示例代码、框架中的运用、适用场景]

这篇具有很好参考价值的文章主要介绍了状态设计模式(State Pattern)[论点:概念、相关角色、图示、示例代码、框架中的运用、适用场景]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

        状态模式(State Pattern)是一种行为型设计模式,用于解决对象在不同状态下的行为问题。它允许一个对象在其内部状态改变时改变它的行为。状态模式主要包含三个部分:上下文(Context)、状态接口(State)和具体状态实现类(ConcreteState)。

组成角色

  1. 状态接口(State):定义一个接口,用于封装与上下文类的一个特定状态相关的行为。
  2. 具体状态实现类(ConcreteState):实现状态接口,定义与该状态相关的行为。
  3. 上下文(Context):维护一个 State 类型的对象实例,该实例定义当前的状态。

相关图示

图片来自:https://refactoringguru.cn/design-patterns/state
状态设计模式(State Pattern)[论点:概念、相关角色、图示、示例代码、框架中的运用、适用场景]

代码示例

//状态接口
interface State {
    void handle(Context context);
}


//具体状态实现类ConcreteStateA、ConcreteStateB
class ConcreteStateA implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前状态是 A.");
      	//设置下一个执行状态节点
        context.setState(new ConcreteStateB());
    }
}

class ConcreteStateB implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前状态是 B.");
      	//设置下一个执行状态节点
        context.setState(new ConcreteStateA());
    }
}

//上下文对象
class Context {
  	
  	//当前执行节点
    private State state;

    public Context(State state) {
        this.state = state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public State getState() {
        return state;
    }
		
  	//执行节点逻辑
    public void request() {
        state.handle(this);
    }
}

public class StatePatternDemo {
    public static void main(String[] args) {
        State initialState = new ConcreteStateA();
        Context context = new Context(initialState);
	
		//状态节点流转 A -> B -> A			
        context.request(); // 输出:当前状态是 A.
        context.request(); // 输出:当前状态是 B.
        context.request(); // 输出:当前状态是 A.
    }
}

框架中的应用

        一个常见的使用状态设计模式的例子是Java线程的状态管理。Java的Thread类使用了状态模式来表示线程的不同状态,例如:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。这些状态之间的转换由Thread类和相关的方法控制。

Thread.State枚举,它定义了Java线程的各种状态:

public enum State {
    NEW,
    RUNNABLE,
    BLOCKED,
    WAITING,
    TIMED_WAITING,
    TERMINATED;
}

线程状态之间的转换:

  1. NEW:当线程刚创建时,它处于NEW状态。在这个状态下,线程还没有开始执行。
  2. RUNNABLE:当调用线程的start()方法后,线程进入RUNNABLE状态。此时,线程已经开始执行或者准备执行,等待操作系统分配资源。
  3. BLOCKED:当线程试图获取一个已被其他线程锁定的对象的监视器(即进入synchronized块)时,线程进入BLOCKED状态。一旦锁被释放,线程将重新进入RUNNABLE状态。
  4. WAITING:当线程调用wait()、join()或LockSupport.park()方法时,线程进入WAITING状态。这表示线程正在等待另一个线程的通知或中断。当线程收到通知或中断时,它将重新进入RUNNABLE状态。
  5. TIMED_WAITING:当线程调用wait(long timeout)、sleep(long millis)、join(long millis)或LockSupport.parkNanos()等方法时,线程进入TIMED_WAITING状态。这表示线程正在等待另一个线程的通知、中断或超时。当线程收到通知、中断或超时时,它将重新进入RUNNABLE状态。
  6. TERMINATED:当线程执行完成或被中断时,它进入TERMINATED状态。在这个状态下,线程已经结束,不能再次启动。

状态切换图

状态设计模式(State Pattern)[论点:概念、相关角色、图示、示例代码、框架中的运用、适用场景]

适用场景

  1. 对象的行为随其状态改变而改变:当一个对象的行为因其内部状态而改变时,可以考虑使用状态模式。状态模式将对象的状态和行为分离,使得状态和行为可以独立地变化,提高了代码的灵活性和可维护性。
  2. 避免大量条件语句:状态模式可以减少因状态判断而导致的大量条件语句。通过使用状态模式,可以将状态相关的行为分散到各个状态类中,降低了代码的复杂性。
  3. 状态转换清晰:当一个对象的状态转换逻辑复杂且需要明确表示时,状态模式可以使状态转换更加清晰。状态模式将状态转换逻辑封装在状态类中,有助于理解和维护状态转换逻辑。

以下是一些使用状态设计模式的实际场景:文章来源地址https://www.toymoban.com/news/detail-413279.html

  1. 线程状态管理:Java线程状态管理是状态设计模式的一个典型应用。线程的状态(如新建、运行、阻塞等)由Thread.State枚举表示,状态之间的转换由Thread类及其相关方法控制。
  2. 工作流引擎:工作流引擎通常需要处理多个状态和状态之间的转换。状态模式可以帮助设计一个灵活的工作流引擎,使得状态和行为可以独立地变化。
  3. 游戏角色状态:在游戏开发中,角色可能有多种状态(如站立、行走、攻击等),并且状态之间可以相互转换。使用状态模式可以使游戏角色的状态管理更加清晰。
  4. 订单状态管理:在电商系统中,订单可能有多个状态(如待付款、待发货、已发货等),并且状态之间有一定的转换逻辑。状态模式可以帮助设计一个易于维护的订单状态管理系统。

到了这里,关于状态设计模式(State Pattern)[论点:概念、相关角色、图示、示例代码、框架中的运用、适用场景]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]

            生成器设计模式(Builder Design Pattern)是一种创建型设计模式,用于处理具有多个属性和复杂构造过程的对象。生成器模式通过将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。这有助于减少构造函数的参数个数,提高代码的可读性和可维

    2023年04月11日
    浏览(43)
  • 命令设计模式(Command Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

            命令设计模式 (Command Pattern)是一种行为设计模式,它将请求的操作封装为一个对象,从而实现请求者和执行者之间的解耦。这样,请求者只需要知道如何发送请求,而无需关心请求的具体执行过程。命令模式在很多场景下都非常有用,例如撤销操作、延迟执行、

    2024年02月01日
    浏览(49)
  • 观察者设计模式(Observer Design Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

            观察者设计模式(Observer Design Pattern)是一种行为型设计模式,它定义了一种对象间的一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生改变时,通知所有观察者对象,使它们能够自动更新。 主题(Subject):主题是一个抽象类或

    2023年04月24日
    浏览(45)
  • 3.8设计模式——State 状态模式(行为型)

    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 Context(上下文)定义客户感兴趣的接口;维护一个ConcreteState子类的实例,这个实例定义当前状态。 State(状态)定义一个接口以封装与Context的一个特定状态相关的行为。 ConcreteState(具体状态

    2024年04月26日
    浏览(35)
  • 设计模式之状态模式(State)的C++实现

    在组件功能开发过程中,某些对象的状态经常面临变化,不同的状态,其对象的操作行为不同。比如根据状态写的if else条件情况,且这种条件变化是经常变化的,这样的代码不易维护。可以使用状态模式解决这类问题。状态模式是将状态值抽象成一个基类,将不同状态下的操

    2024年02月12日
    浏览(43)
  • C++设计模式_18_State 状态模式

    State和Memento被归为“状态变化”模式。 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。 State Memento

    2024年02月06日
    浏览(36)
  • 【设计模式——学习笔记】23种设计模式——状态模式State(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    请编写程序完成APP抽奖活动具体要求如下: 假如每参加一次这个活动要扣除用户50积分,中奖概率是10% 奖品数量固定,抽完就不能抽奖 活动有四个状态: 可以抽奖、不能抽奖、发放奖品和奖品领完,活动的四个状态转换关系图如下 一开始的状态为“不能抽奖”,当扣除50积分

    2024年02月12日
    浏览(48)
  • 《游戏编程模式》学习笔记(七)状态模式 State Pattern

    允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。 在书的示例里要求你写一个人物控制器,实现跳跃功能 直觉上来说,我们代码会这么写: 可是这么写不对,因为人物本身应该只能跳一次,这样写的话人物就可以无限按B实现跳跃了。我们加一个

    2024年02月11日
    浏览(47)
  • 【设计模式--原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)是一种创建型设计模式,它的主要目的是通过复制现有对象来创建新的对象,而无需显式地使用构造函数或工厂方法。这种模式允许我们创建一个可定制的原型对象,然后通过复制它来创建新的对象,从而避免了重复构建相似的对象。 在原型模式中

    2024年02月11日
    浏览(39)
  • 设计模式-组合模式(Composite Pattern)

    组合模式是一种结构型设计模式,它允许将对象组合成树状的层次结构,用来表示“整体-部分”的关系。 原理图 抽象角色(Component) :这是组合模式的核心,它定义了树叶和树枝构件的公共接口,并可能提供一些默认行为。在透明式的组合模式中,它还声明了访问和管理子

    2024年04月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包