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

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

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

运行结果如下:

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

相关推荐
架构师沉默4 小时前
设计多租户 SaaS 系统,如何做到数据隔离 & 资源配额?
java·后端·架构
Java中文社群5 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL6 小时前
JVM 类加载:双亲委派机制
java·后端
用户298698530147 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥7 小时前
原来公平锁和非公平锁差别这么大
java
渣哥7 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K7 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty7257 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构
isysc19 小时前
面了一个校招生,竟然说我是老古董
java·后端·面试
幂简集成explinks9 小时前
e签宝签署API更新实战:新增 signType 与 FDA 合规参数配置
后端·设计模式·开源