【设计模式】—— 状态模式State
时间:2022-04-22
本文章向大家介绍【设计模式】—— 状态模式State,主要内容包括模式意图、模式结构、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
模式意图
允许一个对象在内部改变它的状态,并根据不同的状态有不同的操作行为。
例如,水在固体、液体、气体是三种状态,但是展现在我们面前的确实不同的感觉。通过改变水的状态,就可以更改它的展现方式。
应用场景
1 当一个对象的行为,取决于它的状态时
2 当类结构中存在大量的分支,并且每个分支内部的动作抽象相同,可以当做一种状态来执行时。
模式结构
Context 环境角色,里面包含状态对象
class Context{
private State state;
public void setState(State state) {
this.state = state;
}
public void operation(){
state.operation();
}
}
State 状态的抽象接口
interface State{
public void operation();
}
ConcreteState 具体的状态角色
class ConcreteState1 implements State{
public void operation(){
System.out.println("state1 operation");
}
}
class ConcreteState2 implements State{
public void operation(){
System.out.println("state2 operation");
}
}
class ConcreteState3 implements State{
public void operation(){
System.out.println("state3 operation");
}
}
全部代码
1 package com.xingoo.test.design.state;
2 class Context{
3 private State state;
4 public void setState(State state) {
5 this.state = state;
6 }
7 public void operation(){
8 state.operation();
9 }
10 }
11 interface State{
12 public void operation();
13 }
14 class ConcreteState1 implements State{
15 public void operation(){
16 System.out.println("state1 operation");
17 }
18 }
19 class ConcreteState2 implements State{
20 public void operation(){
21 System.out.println("state2 operation");
22 }
23 }
24 class ConcreteState3 implements State{
25 public void operation(){
26 System.out.println("state3 operation");
27 }
28 }
29 public class Client {
30 public static void main(String[] args) {
31 Context ctx = new Context();
32 State state1 = new ConcreteState1();
33 State state2 = new ConcreteState2();
34 State state3 = new ConcreteState3();
35
36 ctx.setState(state1);
37 ctx.operation();
38
39 ctx.setState(state2);
40 ctx.operation();
41
42 ctx.setState(state3);
43 ctx.operation();
44 }
45 }
运行结果
state1 operation
state2 operation
state3 operation
- Python云计算框架:OpenStack源码分析之RabbitMQ(二)
- 编程获得CPU的主频
- Python多进程并行编程实践:以multiprocessing模块为例
- 由函数clock想到的
- (34) 随机 / 计算机程序的思维逻辑
- 创建和使用Windows静态链接库
- (37) 泛型 (下) - 细节和局限性 / 计算机程序的思维逻辑
- 快速失败Vs安全失败(Java迭代器附示例)
- Flask-SocketIO 文档译文
- 屏幕输出VS文件输出
- 判断一个数是不是2的幂
- (32) 剖析日期和时间 / 计算机程序的思维逻辑
- Python开发微信公众号后台(系列三)
- 【新手向】为何要这样安装Django?
- 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 数组属性和方法
- 得到目录大小
- DataGrid 的 全选/取消全选 控制(CheckBox)
- App+游戏的变现模式分析
- 我在新版 Creator 2.4.0 发布头条小游戏遇到的坑!不过我爬出来了!
- 为你的好朋友添点评论
- 重磅!H5游戏接入App已经解决了,民间SDK将会崛起!
- 旋转排序的数组
- 【自动化】利用webhooks自动化构建、编译Vue
- k8s prometheus的语法检查
- docker一键部署SpringBoot项目
- SpringBoot 2.3.0 新特性一览,快来跟我实践一波!
- 【腾讯】在前端开发中,如何获取浏览器的唯一标识
- 如何实现表格单双行条纹样式
- Angular 容易忽略的知识点
- 语雀自动同步到hexo博客