设计模式—行为型模式之状态模式

设计模式---行为型模式之状态模式

状态(State)模式:对有状态的对象,把复杂的"判断逻辑"提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

状态模式包含以下主要角色:

  • 环境类(Context)角色:也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。
  • 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为,可以有一个或多个行为。
  • 具体状态(Concrete State)角色:实现抽象状态所对应的行为,并且在需要的情况下进行状态切换。

示例

比如我们的会议有以下状态:待创建、待开始、进行中、已结束状态;我们的代码如下:

java 复制代码
/**
 * 状态接口
 */
public interface MeetingStateInterface {
    //当前状态
    void state();

    //下一个状态
    MeetingStateInterface next();
}

public class WaitCreateMeetingState implements MeetingStateInterface{
    @Override
    public void state() {
        System.out.println("当前在待创建状态");
    }

    @Override
    public MeetingStateInterface next() {
        return new WaitStartMeetingState();
    }
}

public class WaitStartMeetingState implements MeetingStateInterface{
    @Override
    public void state() {
        System.out.println("待开始状态");
    }

    @Override
    public MeetingStateInterface next() {
        return new ProcessingMeetingState();
    }
}

public class ProcessingMeetingState implements MeetingStateInterface{
    @Override
    public void state() {
        System.out.println("会议进行中状态");
    }

    @Override
    public MeetingStateInterface next() {
        return new EndMeetingState();
    }
}

public class EndMeetingState implements MeetingStateInterface{
    @Override
    public void state() {
        System.out.println("已结束会议状态");
    }

    @Override
    public MeetingStateInterface next() {
        return null;
    }
}

会议类如下:

java 复制代码
public class Meeting {
    
    private MeetingStateInterface meetingState;

    public void setMeetingState(MeetingStateInterface meetingState) {
        this.meetingState = meetingState;
    }
    
    //会议当前状态
    public void state(){
        meetingState.state();
    }
    
    //下一个状态
    public void nextState(){
        if(this.meetingState != null){
			this.meetingState = this.meetingState.next();
        }
    }
}
java 复制代码
public class StateTest {
    public static void main(String[] args) {
        Meeting meeting = new Meeting();
        meeting.setMeetingState(new WaitCreateMeetingState());
        meeting.state();
        meeting.nextState();
        meeting.state();
        meeting.nextState();
        meeting.state();
        meeting.nextState();
        meeting.state();
        meeting.nextState();
    }
}

运行结果如下:

状体模式一定要有状态切换。

相关推荐
程序员清风12 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55113 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊19 小时前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing19 小时前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠1 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840821 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide2 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家2 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺2 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602732 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端