状态机

设计模式-状态模式

怎甘沉沦 提交于 2020-04-07 09:57:50
状态模式的特点是,对于有状态的对象,我们可以把复杂的“判断逻辑”提取到不同的状态对象中,允许内置的状态对象改变时影响它的行为。状态模式可以有效的减少if else 的分支结构;它将状态和行为绑定到一起,根据不同的状态来确定其行为。这样做的好处是将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。但是状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。 模式结构 上下文(context):状态运行的环境 抽象状态(State)角色:对状态类型的抽象 具体状态(Concrete State)角色:状态类型的实现 源码导读 在复杂的业务场景中,我们一般使用状态机来实现状态的切换。状态机便是基于状态模式的思想设计。下面我们介绍spring组件中的状态机组件 spring statemachine 有限状态机。使用状态机可以让我们更加舒服而优雅的使用状态模式。 这里举例一个状态机适用场景——订单的支付到审核: 新建一个 spring boot 工程,添加依赖: <dependency> <groupId>org.springframework.statemachine</groupId> <artifactId>spring-statemachine-core</artifactId> </dependency> 定义状态枚举值和事件枚举值:

generator函数应用

梦想的初衷 提交于 2020-04-06 19:34:39
generator 应用 创建状态机,实现状态之间的切换 // // 状态机 // function* toggle() { // while (true) { // yield false; // yield true; // } // } // // 状态机 // let t = toggle(); // // 点击按钮,切换状态 // btn.onclick = () => { // console.log(t.next()) // } // 轮播图;状态:索引值 // function* swiper(num) { // while (true) { // // 根据图片数量,切换状态 // for (let i = 0; i < num; i++) { // yield i; // } // } // } // // 创建轮播图状态机 // let s = swiper(5); // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next()) // console.log(s.next())

状态机模型

时光总嘲笑我的痴心妄想 提交于 2020-04-02 23:52:58
1049. 大盗阿福 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N 家店铺,每家店中都有一些现金。 阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。 作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。 他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金? 输入格式 输入的第一行是一个整数 T,表示一共有 T 组数据。 接下来的每组数据,第一行是一个整数 N ,表示一共有 N 家店铺。 第二行是 N 个被空格分开的正整数,表示每一家店铺中的现金数量。 每家店铺中的现金数量均不超过1000。 输出格式 对于每组数据,输出一行。 该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。 数据范围 1≤T≤50, 1≤N≤105 输入样例: 2 3 1 8 2 4 10 7 6 14 输出样例: 8 24 样例解释 对于第一组样例,阿福选择第2家店铺行窃,获得的现金数量为8。 对于第二组样例,阿福选择第1和4家店铺行窃,获得的现金数量为10+14=24。 思路: \(f[i,0]\) 表示在前i家商店且不偷i家的最大获利, \(f[i,1]\) 表示在前i家商店且偷i家的最大获利. #include<bits/stdc++.h> using namespace

关于FSM的C语言实现与详解

好久不见. 提交于 2020-03-30 04:50:06
最近一个项目有一个需求,考量了一下决定使用状态机,实现完需求以后,不得不感慨,状态机在处理逻辑上面实现起来很有优势,也便于管理。 在这里分享一下我所修改的状态机实现。改动的地方不多,参考了《 C语言 最优状态机 规范 - 投机者 》 和原作者的实现一样,状态机的跳转通过函数指针实现,将有关的状态函数实现入口放进一个数组,为了方便维护,数组的下标采取枚举型变量对应。 只要枚举变量中的下标顺序和函数指针数组对应,状态函数中返回下一次的状态,在主体函数中读取到上一次的状态,就可以完成状态机了。 为了方便控制和外部调用,我引入了一个专门记录状态的数据域(st),存放了当前的状态和下一个状态,还引出了一个能够重置状态机状态的接口; 以下是我的实现,使用的时候最简单的方法便是修改头文件中的step_*函数,以及Steps数组与states。高级一点可以将后2者引出,通过外部传参的方式实现。 完整的项目地址请点我 。    这里是其中的一个可用的简单版本 /* # File : fsm.h # Author : toujizhe, schips # Git : https://gitee.com/schips/ # Ref : https://www.cnblogs.com/toujizhe/articles/5473489.html # Date : 2016-05-09 12:20,

自己动手写一个简单正则表达式解析器(待续,未完成)

回眸只為那壹抹淺笑 提交于 2020-03-29 20:26:50
1.状态机及形式语言基础 2. 版本1:仅仅匹配一个? 3. 版本2:如何匹配*? 4. 如何实现*, ?的匹配? 5. 如何实现根据输入的pattern,生成DFA状态机? 1. 状态机及形式语言基础 1.1 语言和文法 在计算机中存在下面两个比较重要的问题,一个问题提出之后,能否使用计算机来执行,如果能够执行的话,那么该怎么执行?这些都是计算模型需要解决的问题,为解决山这些问题,需要来首先了一下什么是形式语言,相对于自然语言而言,如何去描述一个形式语言(文法)? 自然语言就是日常的口头语言,将一个自然语言翻译成另外的一种自然语言的问题引出了“形式语言”的概念。下面就是一个迭代的定义: 1. 字母表V :含有有限元素的非空集合,其中包含终结符号(无法被替换的符号)记为T;非终结符号(简单的将是能够被替换的元素),记为N;定义开始符S为推导的开始。 2. 单词 :定义在字母表V上的单词定义为V中元素组成的有限长度的字串。 3. 空串 :没有符号的串,记为 λ 4. V上所有单词的集合记为V* 5. 指明V*中的串能够被什么样的串替换的表达式称之为“ 产生式” 6. 有了上面的基础开始定义什么是文法: 文法 是由下面的是是部分组成:G = < V, T, S, P >,其中字母表V,有V上的所有的终结符组成的集合T,S为推导的开始符,P为产生式的集合。 7. 下面定义什么是 语言 L

Raft系列文章之一: 什么是Raft?

陌路散爱 提交于 2020-03-26 13:16:31
3 月,跳不动了?>>> 简单的说, Raft 是一种易于理解的一致性算法,其功能相当于Paxos。目前很多提供一致性服务的系统都采用Paxos, 例如Chubby, ZooKeeper, 那么为何还需要 Raft ?自Lamport 1998年提出Paxos以来, 该协议虽逐渐成为主流一致性协议,但也以难以理解而著名,实现起来比较困难。针对 Raft 难以理解的缺陷, Raft 设计的主要目的之一就是容易理解, Raft 将整个算法过程分解为若干个独立的子过程,并且详细描述了每个子过程如何实现,容易理解和实现。我自己也用 Java 实现了 Raft , 代码在 https://github.com/chicm/CmRaft , 本系列文章的最后我将介绍我的实现。 本文主要参考了 In Search of an Understandable Consensus Algorithm (Extended Version) ,也包含了我自己的理解。 那么什么是一致性算法? 一致性是分布式容错系统的基本功能,例如在分布式共享文件系统中,通常有多台服务器向客户提供文件服务,当客户通过其中一台服务器A向文件系统存储 了一个文件,如何保证能从服务器B获取刚刚保存的文件?其核心问题在于多台机器就某个值达成一致,一旦某个值达成了一致,客户向整个集群的任何一台机器请 求该值时都会得到同一个值

Kafka技术内幕——图文详解Kafka源码设计与实现

让人想犯罪 __ 提交于 2020-03-24 16:50:52
3 月,跳不动了?>>> 引言 Apache Kafka (简称Kafka )最早是由LinkedIn开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开源领域应用最广泛的消息系统之一。Kafka社区 也非常活跃,从0.9版本开始,Kafka的标语已经从“一个高吞吐量、分布式的消息系统”改为“一个分布式的流平台”。Kafka自LinkedIn 开源以来就以高性能、高吞吐量、分布式的特性著称。本书以0.10版本的源码为基础,深入分析了Kafka 的设计与实现,包括生产者和消费者的消息处理流程,新旧消费者不同的设计方式,存储层的实现,协调者和控制器如何确保Kafka集群的分布式和容错特性,两种同步集群工具MirrorMaker和uReplicator,流处理的两种API以及Kafka的些高级特性等 。本书适合Kafka开发人员阅读。 书本主页 书本目录 生产者 :从一个生产者的示例开始,引出了新版本生产者的两种消息发送方式。生产者客户端通过记录收集器和发送线程,对消息集进行分组和缓存,并为目标节点创建生产请求,发送到不同的代理节点。接着介绍了与网络相关的Kafka通道、选择器、轮询等NIO操作。另外,还介绍了Scala版本的旧生产者,它使用阻塞通道的方式发送请求。最后,介绍了服务端采用 Reactor模式处理客户端的请求。 消费者:高级API和低级API

Windows Workflow Foundation之旅(六)——框架组成、工作流创作模式

吃可爱长大的小学妹 提交于 2020-03-23 02:33:46
翻译自: ms-help://MS.WinWF.v1.EN/WinWF_GettingStarted/html/68db11eb-3d20-41ca -90f 7-ae635fd4e 2a 2.htm 这个专题前面的三个指南,介绍了 WWF 编程了三个大方面: 顺序工作流 、 状态机工作流 和自 定义活动 。相信大家对 WWF 的编程模型已经有了一个初步的了解。从这次开始,我们就要深入 WWF ,全面的探究一下 WWF 。 传统的编程语言是针对短期运行应用程序的,缺乏 持久化 和 抗中断 的功能支持。 WWF 是一个框架,不是一种语言。他对工作流应用程序有深刻的认识,提供了各种手段来处理持久化,中断补偿,故障恢复等功能。 WWF 同时具有 灵活性 和 可扩展性 。你可以直接用代码定义工作流,也可以用外部的定义语言也定义,或同时使用两者。你可以用你自己的自定义活动来实现自定义的工作流模式,以到达可重用的目的。 WWF 支持 模型驱动 的开发,提供了 可视化 的设计工具,并隐藏了一些系统级的功能,如事务、状态管理和并发控制,是开发者可以专注于业务模型。 WWF 中的工作流和活动 工作流 是一组相关的活动的集合。 活动 是 WWF 中可建模、可编程、可重用、可执行的原子单位。 WWF 提供了一组丰富的活动库,来构建你的工作流。 WWF 的工作流应用程序 一个应用程序必须做以下步骤

什么是TCP拥塞控制算法?

一世执手 提交于 2020-03-22 23:44:08
最近花了些时间在学习TCP/IP协议上,首要原因是由于本人长期以来对TCP/IP的认识就只限于三次握手四次分手上,所以希望深入了解一下。再者,TCP/IP和Linux系统层级的很多设计都可以用于中间件系统架构上,比如说TCP 拥塞控制算法也可以用在以响应时间来限流的中间件上。更深一层,像TCP/IP协议这种基础知识和原理性的技术,都是经过长时间的考验的,都是前人智慧的结晶,可以给大家很多启示和帮助。 本文中会出现一些缩写,因为篇幅问题,无法每个都进行解释,如果你不明白它的含义,请自己去搜索了解,做一个主动寻求知识的人。 TCP协议有两个比较重要的控制算法,一个是流量控制,另一个就是阻塞控制。 TCP协议通过滑动窗口来进行流量控制,它是控制发送方的发送速度从而使接受者来得及接收并处理。而拥塞控制作用于整体网络,它是防止过多的包被发送到网络中,避免出现网络负载过大,网络拥塞的情况。 拥塞算法需要 掌握其状态机和四种算法 。拥塞控制状态机的状态有五种,分别是: "Open,Disorder、CWR、Recovery和Loss状态" 。四个算法为 "慢启动,拥塞避免,拥塞发生时算法和快速恢复" 。 Congestion Control State Machine 和TCP一样,拥塞控制算法也有其状态机。当发送方收到一个ACK时,Linux TCP通过状态机的状态来决定其接下来的行为

TCP 拥塞控制算法简介

ⅰ亾dé卋堺 提交于 2020-03-22 15:26:46
最近花了些时间在学习TCP/IP协议上,首要原因是由于本人长期以来对TCP/IP的认识就只限于三次握手四次分手上,所以希望深入了解一下。再者,TCP/IP和Linux系统层级的很多设计都可以用于中间件系统架构上,比如说TCP 拥塞控制算法也可以用于以响应时间来限流的中间件。更深一层,像TCP/IP协议这种基础知识和原理性的技术,都是经过长时间的考验的,都是前人智慧的结晶,可以给大家很多启示和帮助。  本文中会出现一些缩写,因为篇幅问题,无法每个都进行解释,如果你不明白它的含义,请自己去搜索了解,做一个主动寻求知识的人。  TCP协议有两个比较重要的控制算法,一个是流量控制,另一个就是阻塞控制。  TCP协议通过滑动窗口来进行流量控制,它是控制发送方的发送速度从而使接受者来得及接收并处理。而拥塞控制是作用于网络,它是防止过多的包被发送到网络中,避免出现网络负载过大,网络拥塞的情况。  拥塞算法需要掌握其状态机和四种算法。拥塞控制状态机的状态有五种,分别是Open,Disorder,CWR,Recovery和Loss状态。四个算法为慢启动,拥塞避免,拥塞发生时算法和快速恢复。 Congestion Control State Machine  和TCP一样,拥塞控制算法也有其状态机。当发送方收到一个Ack时,Linux TCP通过状态机(state)来决定其接下来的行为