AI Chat 设计模式:11. 状态模式

本文是该系列的第十一篇,采用问答式的方式展开,问题由我提出,答案由 Chat AI 作出,灰色背景的文字则主要是我的一些思考和补充。

Q.1 你知道状态模式吗

A.1

是的,我知道状态模式。状态模式是一种行为设计模式,它允许对象在不同的内部状态下改变其行为。在状态模式中,对象的行为取决于其状态,并且可以在运行时更改对象的状态。

状态模式包括三个主要角色:上下文(Context)、状态接口(State)和具体状态(Concrete State)。上下文是包含状态的对象,并将请求委派给当前状态处理。状态接口定义了所有具体状态必须实现的方法。具体状态是实现状态接口的具体类,每个具体状态负责处理特定的请求。

使用状态模式可以实现将复杂的条件语句转换为清晰的状态类,提高代码的可维护性和可扩展性。状态模式常用于需要根据对象内部状态改变行为的情况,例如状态机、游戏状态管理等。

Q.2 它与有限状态机有什么联系吗?

A.2

状态模式和有限状态机(FSM,Finite State Machine)之间存在一定联系,但它们是不同的概念。

有限状态机是一种数学模型,用于描述对象、系统或者程序的状态以及状态之间的转换。它由一组状态事件转移条件组成,当满足特定的条件时,会发生状态之间的转移。有限状态机可以是确定的(确定性有限状态机)或者非确定的(非确定性有限状态机),并可以用于解决不同的问题,如自动控制、编译器设计等。

而状态模式是一种软件设计模式,它用于将对象的行为与其内部状态相关联。对象在不同的状态下可以具有不同的行为,而状态模式允许对象在运行时根据状态的变化而改变其行为。与有限状态机不同,状态模式更关注对象的内部状态和行为之间的关系。

尽管状态模式和有限状态机都涉及到状态和状态之间的转换,但它们的关注点和应用领域有所不同。状态模式更加注重对象的内部行为和状态之间的关系,而有限状态机更关注的是问题的建模和状态转换过程。

一般认为状态模式是状态机的一种实现方式。

状态机由状态事件动作三部分组成。事件是触发状态转移的条件或原因,动作是进入该状态后产生的行为。当事件发生时,会根据当前状态作出动作,然后进入下一状态。
我们简单举一个倒霉大学生的例子,以毕业了为初始状态,“找到工作了”这一事件发生后,他会进入“兴奋”状态,此时他可能会产生“吃顿好的”这个动作(图里并未画出);有一天发生了“被老板骂”这一事件,他进入了“低落状态”,在该状态下会作出什么动作呢?忍了,或者硬刚,或者啥也不做(状态转换后,不一定有动作发生);过了一阵子,他被炒了,“失业”这一事件导致他进入了“沮丧”状态;再后来,“老婆跑了”,这一事件直接让他进入了“绝望”状态;然后又发生了一些事,这个大学生进入了“无”的状态。
如果想更多了解状态机,就需要去专门学习一下相关文章了,这里只是简单介绍。
在这里插入图片描述

Q.3 知道了,我是第一次学习状态模式,你能由浅入深给我讲解一下吗

A.3

当然可以!我可以帮你由浅入深地理解状态模式。

状态模式的核心思想是将对象的行为和状态分离,通过定义不同的状态类来管理对象的状态并实现相应的行为。这使得对象的行为可以根据状态的变化而灵活改变,同时也减少了大量的条件语句,提高了代码的可读性和可维护性。

让我们以一个简单的示例来说明状态模式的使用。

假设我们要设计一个电梯系统,其中电梯可以处于三种状态:关闭状态开启状态运行状态。不同状态下,电梯的行为是不同的。

首先,我们创建一个状态接口(State),该接口定义了所有具体状态类必须实现的方法,比如opencloserun等方法。

public interface State {
   
    void open();
    void close();
    void run();
}

open()、close()、run() 这三个方法,定义了电梯的三个行为,同时也是我们前面提到的状态转移条件(事件)。

然后,我们创建具体的状态类,分别是OpenStateCloseStateRunState,它们实现了状态接口,负责实现对应状态下的行为。

public class OpenState implements State {
   
    @Override
    public void open() {
   
        System.out.println("电梯已经是开启状态,无需再次开门");
    }

    @Override
    public void close() {
   
        System.out.println("电梯关闭门");
        // 切换到关闭状态
        context.setState(new CloseState());
    }

    @Override
    public void run() {
   
        System.out.println("电梯正在运行,无法切换到运行状态");
    }
}

public class CloseState implements State {
   
    @Override
    public void open() {
   
        System.out.println("电梯开门");
        // 切换到开启状态
        context.setState(new OpenState());
    }

    @Override
    public void close() {
   
        System.out.println("电梯已经是关闭状态,无需再次关闭");
    }

    @Override
    public void run() {
   
        System.out.println("电梯开始运行");
        // 切换到运行状态
        context.setState(new RunState());
    }
}

public class RunState implements State {
   
    @Override
    public void open() {
   
        System.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值