状态模式-处理多种状态转换

状态模式是一种设计模式,允许对象在内部状态改变时改变其行为。它将不同状态的行为封装到具体状态类中,使得环境类可以灵活地切换状态,而无需直接修改自身。在Java中,通过定义抽象状态类和具体状态类,环境类持有抽象状态类的实例,从而实现在运行时动态改变对象的行为。状态模式解决了状态变化导致的代码维护难题,遵循开闭原则,有利于系统的扩展和维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

状态模式定义

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

状态模式结构图

在这里插入图片描述

状态模式角色介绍

环境类,Context,环境类又称为上下文类,它是拥有多种状态的对象。同时还维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。

抽象状态类,State,一个抽象类或者接口,声明了各种不同状态对应的方法,而在其子类中实现类这些方法。

具体状态类,ConcreteState,它是抽象状态类的子类,每一个具体状态类对应环境的一个具体状态,状态子类都会持有环境类对象,当状态发生变更时,将变更的状态同步给环境对象。

状态模式结构代码

抽象状态类:

public interface State {
    void handler();
}

具体状态类A:

public class ConcreteStateA implements State {
    private Context context;

    public ConcreteStateA(Context context) {
        this.context = context;
    }

    public void handler() {
        //执行状态A逻辑,然后修改状态变为状态B
        System.out.println("ConcreteStateA.handler()");
        context.setCurrentState(context.getStateB());
    }
}

具体状态类B:

public class ConcreteStateB implements State {

    private Context context;

    public ConcreteStateB(Context context) {
        this.context = context;
    }

    public void handler() {
        //执行状态B逻辑,然后修改状态变为状态A
        System.out.println("ConcreteStateB.handler()");
        context.setCurrentState(context.getStateA());
    }
}

环境类:

public class Context {

    private State stateA;
    private State stateB;
    //当前状态默认为状态A
    private State currentState;

    //构造函数初始化状态,将当前对象同步给状态对象
    public Context(){
        this.stateA = new ConcreteStateA(this);
        this.stateB = new ConcreteStateB(this);
        currentState = this.stateA;
    }

    //设置当前状态
    public void setCurrentState(State currentState) {
        this.currentState = currentState;
    }

    //获取状态A
    public State getStateA() {
        return stateA;
    }

    //获取状态B
    public State getStateB() {
        return stateB;
    }

    public void request(){
        this.currentState.handler();
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        context.request();
        context.request();
    }
}
状态模式运行机制

在状态模式中,我们将对象在不同状态下的行为封装到不同的状态类中,环境类操作状态时,只需要针对抽象状态类编程,所有状态行为的执行和变更同步都交给状态子类来完成。
环境类正向执行状态类进行状态操作,状态类执行完成后再来一个“回手掏”的动作把状态变更同步给环境类。

状态模式解决的核心问题

将状态具体逻辑操作和状态变更从环境类里抽出来,交给各个状态子类管理;也就是将环境类和状态操作进行解耦,状态逻辑变更和状态增减对环境类无影响,便于维护和扩展,符合开闭原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值