设计模式-状态模式
时间:2022-07-25
本文章向大家介绍设计模式-状态模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
晚上睡觉前,需要关灯睡觉。一关一开,类似状态模式的,而开关主要是用来切换所需要的状态,由于不同的状态产生不同的结果。
状态模式是什么?
状态模式(State Pattern)是设计模式的一种,属于行为模式。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
角色
Context(上下文或称环境):通常用来定义客户感兴趣的接口,同时维护一个来具体处理当前状态的实例对象。
State(抽象状态):用来封装与上下文的一个特定状态所对应的行为。
ConcreteState(状态具体实现):具体实现状态处理的类,每个类实现一个跟上下文相关的状态的具体处理。
状态模式可以干嘛?
状态模式主要用于根据不同的状态进行切换而获取不同的信息或结果,根据客户的请求来根据自身状态进行切换。
优点:
结构清晰:减少了很多判断,避免了代码过多的判断,并且可维护性比较高;
遵循设计原则,封装性强:由于各个状态的职责单一所以单一职责这个原则遵循了。状态的切换是通过内部来实现的,客户不需要知道具体的状态和实现。
缺点:
状态过多会引起代码状态类过多臃肿。
个人理解:
状态就像家里的电灯,开灯,关灯,通过不能的状态展示不同的结果。
状态模式类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
/**
* @Auther: csh
* @Date: 2020/6/12 18:00
* @Description:Context(上下文或称环境)
*/
public class Context {
private State state;
public Context() {
state = null;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
/**
* @Auther: csh
* @Date: 2020/6/12 18:03
* @Description:
*/
public interface State {
//操作
public void operation(Context context);
}
/**
* @Auther: csh
* @Date: 2020/6/12 18:45
* @Description:ConcreteState(状态具体实现)
*/
public class OpenState implements State {
@Override
public void operation(Context context) {
System.out.println("触发打开电灯!");
context.setState(this);
}
@Override
public String toString() {
return "打开电灯!";
}
}
/**
* @Auther: csh
* @Date: 2020/6/12 18:48
* @Description:ConcreteState(状态具体实现)
*/
public class CloseState implements State {
@Override
public void operation(Context context) {
System.out.println("触发关闭电灯!");
context.setState(this);
}
@Override
public String toString() {
return "关闭电灯!";
}
}
/**
* @Auther: csh
* @Date: 2020/6/12 18:00
* @Description:Context(上下文或称环境)
*/
public class Context {
private State state;
public Context() {
state = null;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
/**
* @Auther: csh
* @Date: 2020/6/12 18:48
* @Description:演示开关灯通过状态进行变更。
*/
public class Client {
public static void main(String[] args) {
Context context = new Context();
OpenState openState = new OpenState();
openState.operation(context);
System.out.println(context.getState().toString());
CloseState closeState = new CloseState();
closeState.operation(context);
System.out.println(context.getState().toString());
}
}
结果
触发打开电灯!
打开电灯!
触发关闭电灯!
关闭电灯!
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
最后
状态模式在实际工作中,相应的状态是结合数据库定义某个字段进行存储的,当用户促发进行变更,而这种模式相对来说也是比较复杂的,不同的场景会根据这个模式的思想可以衍生出很多实现方式,所以设计思维是第一位。
- 甜品店切蛋糕问题(动态规划,Go语言实现)
- SQL—复制表结构及其数据
- python连接SQL报错:1366, "Incorrect string value: '\xF0\x9F\x98\x81'
- PCIE的简单配置(r8笔记第82天)
- 7个深度神经网络可视化工具,不可错过!
- Pwnhub之奇妙的巨蟒 Writeup
- WINDOW 安装mysql5.7数据库,并设置密码及相关报错
- go channel 通信通道
- SQl 语句(常见) 新建,删除,修改表,新增字段,修改默认值
- SQL处理表结构的基本方法整理(创建表,关联表,复制表)
- Go web之旅(路由篇)
- Golang插入排序
- Golang写的并行排序算法
- Go中调用dll示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP单元测试配置与使用方法详解
- Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
- laravel 查询数据库获取结果实现判断是否为空
- 浅析PHP中的 inet_pton 网络函数
- php解压缩zip和rar压缩包文件的方法
- laradock环境docker-compose操作详解
- laravel中的fillable和guarded属性详解
- PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
- Laravel 6 将新增为指定队列任务设置中间件的功能
- Python生成器传参数及返回值原理解析
- PHP Swoole异步MySQL客户端实现方法示例
- PHP实现微信公众号验证Token的示例代码
- Laravel框架之解决前端显示图片问题
- thinkPHP5.1框架中Request类四种调用方式示例
- Python TestSuite生成测试报告过程解析