状态模式(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 复制代码
当前人物魔法值充足,释放技能!!!
当前人物魔法值不足,不能释放技能!!!
当前人物处于沉默状态,无法释放技能!!!
当前人物魔法值充足,释放技能!!!
相关推荐
思忖小下9 小时前
梳理你的思路(从OOP到架构设计)_简介设计模式
设计模式·架构·eit
liyinuo201711 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
aaasssdddd9613 小时前
C++的封装(十四):《设计模式》这本书
数据结构·c++·设计模式
T1an-113 小时前
设计模式之【观察者模式】
观察者模式·设计模式
思忖小下15 小时前
梳理你的思路(从OOP到架构设计)_设计模式Factory Method模式
设计模式·工厂方法模式·eit
霁月风16 小时前
设计模式——工厂方法模式
c++·设计模式·工厂方法模式
发飙的蜗牛'18 小时前
23种设计模式
android·java·设计模式
NorthCastle1 天前
设计模式-创建型模式-简单工厂模式详解
设计模式·简单工厂模式
越甲八千1 天前
重拾设计模式-外观模式和适配器模式的异同
设计模式·适配器模式·外观模式
越甲八千1 天前
重拾设计模式--适配器模式
设计模式·适配器模式