当前位置: 首页 > news >正文

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

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

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

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

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

示例

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

/*** 状态接口*/
public interface MeetingStateInterface {//当前状态void state();//下一个状态MeetingStateInterface next();
}public class WaitCreateMeetingState implements MeetingStateInterface{@Overridepublic void state() {System.out.println("当前在待创建状态");}@Overridepublic MeetingStateInterface next() {return new WaitStartMeetingState();}
}public class WaitStartMeetingState implements MeetingStateInterface{@Overridepublic void state() {System.out.println("待开始状态");}@Overridepublic MeetingStateInterface next() {return new ProcessingMeetingState();}
}public class ProcessingMeetingState implements MeetingStateInterface{@Overridepublic void state() {System.out.println("会议进行中状态");}@Overridepublic MeetingStateInterface next() {return new EndMeetingState();}
}public class EndMeetingState implements MeetingStateInterface{@Overridepublic void state() {System.out.println("已结束会议状态");}@Overridepublic MeetingStateInterface next() {return null;}
}

会议类如下:

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

运行结果如下:

image-20240112193519932

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

http://www.lryc.cn/news/278829.html

相关文章:

  • Linux习题3
  • SpringBoot+策略模式实现多种文件存储模式
  • 细说DMD芯片信号-DLP3
  • MySQL从0到1全教程【1】MySQL数据库的基本概念以及MySQL8.0版本的部署
  • grep常用命令
  • Spring Data JPA 使用总结
  • 融云 CEO 董晗荣获 51CTO 「2023 年度科技影响力人物奖」
  • 数据洞察力,驱动企业财务变革
  • Postgresql常见(花式)操作完全示例
  • 【Docker】数据管理
  • 认识异常及异常处理机制之try-catch
  • html学习之路:简述html文档头部 <meta> 的 http-equiv 属性
  • 逆矩阵计算
  • 《豫鄂烽火燎原大小焕岭》:一部穿越时空的历史史诗
  • 浅研究下 DHCP 和 chrony
  • 【算法】动态中位数(对顶堆)
  • mysql服务多实例运行
  • 「HDLBits题解」Module fadd
  • 微软等开源评估ChatGPT、Phi、Llma等,统一测试平台
  • DDNS-GO配置使用教程
  • flex弹性盒子常用的布局属性详解
  • 2023年Gartner® DevOps平台魔力象限发布,Atlassian被评为“领导者”
  • kylin集群使用nginx反向代理
  • 小红书搜索团队提出全新框架:验证负样本对大模型蒸馏的价值
  • 汽车销售领域相关专业术语
  • 代币合约 ERC20 Token接口
  • 判断回文字符串—C语言
  • 如何在Docker本地搭建流程图绘制神器draw.io并实现公网远程访问
  • Web前端篇——el-timeline+el-scrollbar时间轴数据刷新后自动显示滚动条
  • Flutter 监听前台和后台切换的状态