状态模式(State Pattern)

状态模式

说明

状态模式(State Pattern)属于行为型模式,也称为状态机模式(State Machine Pattern),是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

在软件开发中,经常需要根据对象的不同状态进行不同的逻辑处理,通常情况下我们会使用if-else/switch-case进行判断处理,但是大量的逻辑判断语句会使程序臃肿,不利用程序的扩展与维护。这时可以将不同状态下的逻辑处理抽象分离出来,使程序更加健壮。

结构

状态模式主要角色如下:

抽象状态角色(State):定义状态处理的统一接口;

具体状态角色(ConcreteState):根据业务需求实现具体状态的业务逻辑,并且可以根据情况调用Context角色进行状态的切换;

上下文角色(Context):维护了一个状态的引用,执行状态对应的行为,并且实现了状态的切换。

代码案例

抽象状态角色(State)

java 复制代码
/**
 * @program: state
 * @description: 人物状态接口
 *              抽象状态角色(State)
 * @author: wxw
 * @create: 2024-03-11 21:51
 **/
public interface ICharacterState {
    // 释放技能方法
    void releaseSkills(Context context);
}

具体状态角色(ConcreteState)

java 复制代码
/**
 * @program: state
 * @description: 沉默状态
 *              具体状态角色(ConcreteState)
 * @author: wxw
 * @create: 2024-03-11 21:53
 **/
public class SilentState implements ICharacterState {

    @Override
    public void releaseSkills(Context context) {
        System.out.println("当前人物处于沉默状态,无法释放技能!!!");
    }
}

/**
 * @program: state
 * @description: 魔法值缺少状态
 *               具体状态角色(ConcreteState)
 * @author: wxw
 * @create: 2024-03-11 21:57
 **/
public class MPDeficiencyState implements ICharacterState {

    @Override
    public void releaseSkills(Context context) {
        System.out.println("当前人物魔法值不足,不能释放技能!!!");
    }
}

/**
 * @program: state
 * @description: 魔法值充足状态
 * @author: wxw
 * @create: 2024-03-11 21:59
 **/
public class MPPlentyState implements ICharacterState {

    @Override
    public void releaseSkills(Context context) {
        System.out.println("当前人物魔法值充足,释放技能!!!");
        // 释放技能后设置为魔法值不足状态
        context.setState(new MPDeficiencyState());
    }
}

上下文角色(Context)

java 复制代码
/**
 * @program: state
 * @description: 上下文角色
 * @author: wxw
 * @create: 2024-03-11 22:00
 **/
public class Context {

    private ICharacterState state;

    public Context() {
        // 默认设置为魔法值充足状态
        this.state = new MPPlentyState();
    }

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

    public void request(){
        this.state.releaseSkills(this);
    }

}

客户端

java 复制代码
public class Test {

    public static void main(String[] args) {
        Context context = new Context();
        // 第一次请求正常释放技能
        context.request();
        // 第二次魔法值不足
        context.request();
        // 设置为沉默状态
        context.setState(new SilentState());
        context.request();
        // 再次设置为魔法值充足状态
        context.setState(new MPPlentyState());
        context.request();
    }
}

输出结果

bash 复制代码
当前人物魔法值充足,释放技能!!!
当前人物魔法值不足,不能释放技能!!!
当前人物处于沉默状态,无法释放技能!!!
当前人物魔法值充足,释放技能!!!
相关推荐
fan_music2 小时前
设计模式学习
c++·设计模式
乐观的山里娃3 小时前
【后编码时代 06】Vibe Coding + Superpowers 完全不够
设计模式·软件工程·ai编程
likerhood4 小时前
设计模式 · 责任链模式(Chain of Responsibility Pattern)
设计模式·责任链模式
追烽少年x7 小时前
STL中的设计模式(一)
c++·设计模式
乐观的山里娃7 小时前
【设计模式 10】抽象工厂:整体换季
设计模式
贵慜_Derek9 小时前
《从零实现 Agent 系统》连载 08|编排与工作流:从 Chat 到任务图
人工智能·设计模式·架构
W.W.H.10 小时前
C++ 设计模式:6 个常用模式的实战示例
开发语言·c++·设计模式
老码观察10 小时前
设计模式实战解读(三):模板方法模式——骨架复用与扩展点设计
设计模式·模板方法模式
雪度娃娃10 小时前
行为型设计模式——状态模式
ui·设计模式·状态模式
折哥的程序人生 · 物流技术专研11 小时前
Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍
java·开发语言·后端·设计模式·面试·架构