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

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

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

运行结果如下:

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

相关推荐
煸橙干儿~~3 分钟前
分析JS Crash(进程崩溃)
java·前端·javascript
2401_854391084 分钟前
Spring Boot大学生就业招聘系统的开发与部署
java·spring boot·后端
Amor风信子5 分钟前
华为OD机试真题---跳房子II
java·数据结构·算法
杨荧31 分钟前
【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统
java·开发语言·vue.js·spring boot·spring cloud·开源
陈逸轩*^_^*1 小时前
Java 网络编程基础
java·网络·计算机网络
这孩子叫逆1 小时前
Spring Boot项目的创建与使用
java·spring boot·后端
星星法术嗲人1 小时前
【Java】—— 集合框架:Collections工具类的使用
java·开发语言
一丝晨光1 小时前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby
天上掉下来个程小白1 小时前
Stream流的中间方法
java·开发语言·windows
刷帅耍帅2 小时前
设计模式-享元模式
设计模式·享元模式