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

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

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

运行结果如下:

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

相关推荐
毕业设计制作和分享21 分钟前
springboot150基于springboot的贸易行业crm系统
java·vue.js·spring boot·后端·毕业设计·mybatis
小梁努力敲代码5 小时前
java数据结构--List的介绍
java·开发语言·数据结构
摸鱼的老谭6 小时前
构建Agent该选Python还是Java ?
java·python·agent
lang201509286 小时前
Spring Boot 官方文档精解:构建与依赖管理
java·spring boot·后端
夫唯不争,故无尤也6 小时前
Tomcat 启动后只显示 index.jsp,没有进入你的 Servlet 逻辑
java·servlet·tomcat
zz-zjx6 小时前
Tomcat核心组件全解析
java·tomcat
Deschen6 小时前
设计模式-外观模式
java·设计模式·外观模式
why技术7 小时前
从18w到1600w播放量,我的一点思考。
java·前端·后端
夫唯不争,故无尤也7 小时前
JavaWeb流式传输速查宝典
java·流式传输
苏小瀚8 小时前
算法---位运算
java·算法