状态模式(State Pattern)

本文介绍了状态模式,一种行为型设计模式,用于根据对象状态改变其行为。它包含抽象状态接口、具体状态实现和上下文角色,通过实例展示了如何使用这些角色来管理对象在不同状态下的行为和状态切换。
摘要由CSDN通过智能技术生成

状态模式

说明

状态模式(State Pattern)属于行为型模式,也称为状态机模式(State Machine Pattern),是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
在软件开发中,经常需要根据对象的不同状态进行不同的逻辑处理,通常情况下我们会使用if-else/switch-case进行判断处理,但是大量的逻辑判断语句会使程序臃肿,不利用程序的扩展与维护。这时可以将不同状态下的逻辑处理抽象分离出来,使程序更加健壮。

结构

状态模式主要角色如下:
抽象状态角色(State):定义状态处理的统一接口;
具体状态角色(ConcreteState):根据业务需求实现具体状态的业务逻辑,并且可以根据情况调用Context角色进行状态的切换;
上下文角色(Context):维护了一个状态的引用,执行状态对应的行为,并且实现了状态的切换。
状态模式-类结构图

代码案例

抽象状态角色(State)

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

具体状态角色(ConcreteState)

/**
 * @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)

/**
 * @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);
    }

}

客户端

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();
    }
}

输出结果

当前人物魔法值充足,释放技能!!!
当前人物魔法值不足,不能释放技能!!!
当前人物处于沉默状态,无法释放技能!!!
当前人物魔法值充足,释放技能!!!
  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值