状态模式的实现

一、写在前面 之前有介绍过状态模式,但是不是特别直接。后来写了一篇 Spring StateMachine 介绍,有几位同学联系我说想要源码。但是其实我觉得如果不是逻辑特别复杂的话,我不是特别推荐使用状态机。因为我们完全可以通过状态模式来实现,而且更加灵活和简单。 二、状态模式 状态模式的定义此处不在赘述,有兴趣的同学可以看下之前的文章。 首先,我们来定义几个名词。 状态(state) 这个比较好理解,状态模式嘛,就是管理状态的变更,所以首先我们要定义状态。 事件(event) 所谓事件,就是指状态变化的原因。例如,订单在经过支付事件之后,由 “待支付” 状态变为了 “待发货” 状态。 上下文(context) 负责状态以及状态的变更。 三、示例 为了跟 spring 的 state-machine 对比,我们依然使用简单订单状态的例子。 3.1 状态(state) /** * 订单状态 */ public interface OrderState { /** * 处理订单事件 * @param orderStateContext 上下文 * @param orderEvent 事件 */ default void handle(OrderStateContext orderStateContext, OrderEvent orderEvent){ System.out.println("can not handle this event " + orderEvent); } } /** * 订单待支付状态 * * @author sunbufu */ public class WaitPayState implements OrderState { @Override public void handle(OrderStateContext orderStateContext, OrderEvent orderEvent) { if (OrderEvent....

August 16, 2019 · 2 min · sunbufu

青蛙与动态规划

1. 问题 之前遇到过这么一个问题{:target="_blank"} ,说有一只青蛙,它想跳到 n 层的楼梯上面去,由于自身原因,它每次只能选择跳 1 层或者 2 层。 问,青蛙有多少种跳法? 第一眼看到这个问题的时候有点蒙,不知道从何下手。不妨先从可见的楼梯层数 n 入手,设求青蛙跳法的方法是 f(n)。 那么当 n=1 时 f(n)=1, n=2 时 f(n)=2, n=3 时 f(n)=3, n=4 时 f(n)=5 … 很明显,f(n) 是一个斐波那锲数列的方法,当前数等于前两个数之和,所以有 f(n)=f(n-1)+f(n-2)。 其实从另一个角度想也可以想明白,假设我是那只青蛙,站在 n 层的楼梯脚下,我有 f(n) 种跳法,现在我能选择的是跳 1 层还是跳 2 层。当我选择跳 1 层时,我接下来的跳法还有 f(n-1) 种;当我选择跳 2 层时,我接下来的跳法还有 f(n-2) 种。所以我在还没有选择之前的跳法应该等于我这两种跳法之和,所以有 f(n)=f(n-1)+f(n-2)。 2. 解答 2.1 递归 上面的思路有了,我们很容易就可以用代码实现了。 public int climbStairs(int n) { if (n <= 0) return 0; if (n == 1) return 1; if (n == 2) return 2; // f(n)=f(n-1)+f(n-2) return climbStairs(n - 1) + climbStairs(n - 2); } 上面的代码虽然可以解决问题,但是会出现很大一部分的重复运算。 如下图所示,当 n=6 时,我们计算了 2 次 f(4), 3 次 f(3)。 2....

June 11, 2019 · 2 min · sunbufu

关于生活的一点思考

1.关于婚姻 2019-03-17 我们在家里举行了婚礼,婚礼还算是隆重。同学、朋友、亲戚和乡里乡亲来的不少,也搞得热热闹闹的,挺开心。当天下午婚礼完成后,粘床就睡着了,有点累也有点满足,我想我们完成了对彼此的承诺。换回正常的衣服,第二天去了我姥姥家,下午又回了门。其实我之前并不喜欢这些仪式,觉得是一种华而不实的繁文缛节而已。但是亲身经历过后改变了我的一些想法,生活是需要仪式感的,真的需要。 后来我们又去到巴黎岛度蜜月,一块同行的也是几对刚刚完婚的新人。到巴里已是半夜,刚下飞机,迎面而来的是热带的气流混杂着焚香的气息。我们报的是七天的旅行团,导游和司机拉着我们到处兜兜转转。留给我印象最深的不是民族风情和无边泳池,更不是五星酒店和悬崖秋千,而是蓝梦岛湛蓝的海水和金巴兰舒缓的落日。我在国内也偶尔去看海,青岛的金沙滩和日照的万平口都是那种淡蓝色的海水冲刷着土黄色的沙滩。而蓝梦岛的海水是真的蓝啊,甚至蓝到以为是一场梦,我想这也许是"蓝梦岛"名称的由来吧。 从巴厘岛回来后,我们的婚假也休完了。又要投入到繁忙的工作和生活中去了,但是我的心情却多了一些小欢愉,我想这就是我对待婚姻对待她的态度吧。 2.关于人生 我们的人生很长,我们有很多目标和理想,也有很多经验和教训。“人生"是一个很大的标题,大到让我们可以聊上三天三夜。有时我会去想,当我们谈论"人生"的时候,我们到底在谈论什么?换个角度来分析这个标题,我们可以把"人生"拆分成很多个的"昨天”、“今天"和"明天”。 “昨天"是已经过去的人生,留给我们的是经验和教训。它是无奈的,因为不管你犯了什么错,多么的悔恨,都无法改变既定的事实。但同时它又是宝贵的,一个人的价值不正是通过他的经验来体现的吗。“明天"是还没有到来人生,我们做的是在它到来之前,结合"昨天"的经验来制定正确的计划。而只有"今天"是我们唯一可以把握的,我们可以无视"昨天"的教训,不管"明天"的计划,洒洒脱脱的浪费"今天”。也可以总结"昨天"的教训,制定"明天"的计划,完完整整的过完充实一天。但是不管怎么做,“今天"终究会变成"昨天”,“明天"也会成为"今天”,而新的"明天"也会缓缓的无法阻挡的到来。 但是从另一方面来讲,对于我们那些很远大的计划来说,我们也不是无计可施了。不用去理会那些流言蜚语,也不去管目标有多么的宏图远大,只需要做好"昨天"的总结、“明天"的计划,一步一步的走完"今天”,无怨无悔就够了。

May 10, 2019 · 1 min · sunbufu

常见缓存淘汰算法

一、缓存 缓存(Cache) 一词来源于 1967 年的一篇电子工程期刊论文。其作者将法语词 “cache” 赋予 “safekeeping storage” 的涵义,用于计算机工程领域。 最早是因为 CPU 与内存之间运算和读写速度不一致,在 CPU 添加一块空间用于提前将内存中数据加载进来,提高 整体的速度,这块空间被称为 缓存(Cache)。如今缓存的概念已被扩充,在内存和硬盘之间也有 Cache(磁盘缓存),乃至在硬盘与网络之间也有某种意义上的 Cache ──称为 Internet 临时文件夹或网络内容缓存等。凡是位于速度相差较大的两种硬件之间,用于协调两者数据传输速度差异的结构,均可称之为 Cache。 但是缓存的空间是宝贵的,所以我们不会将所有的数据都缓存起来,必须依赖一定的规则淘汰掉一部分数据。这个规则就是我们讨论的缓存淘汰算法。 二、缓存淘汰 2.1 FIFO(先入先出) FIFO (First In FIrst Out) 是最简单的算法,原理跟名字一样,“如果一个数据最先进入缓存中,则应该最早淘汰掉”。把缓存中的数据看成一个队列,最先加入的数据位于队列的头部,最后加入位于队列的尾部。当缓存空间不足需要执行缓存淘汰操作时,从队列的头部开始淘汰。 如下所示,假设我们的缓存可以缓存 3 对数据,1 加入时处于队列的头部,2 和 3 加入时缓存空间充足。当 4 加入时,执行缓存淘汰,由于 1 处于队列的头部,所以被淘汰。同理 5 加入时,2 被淘汰。 Java 中有单独的队列 Queue ,可以使用 LinkedList。 1 2 3 4 5 3=c 4=e 5=f 2=b 2=b 3=c 4=e 1=a 1=a 1=a 2=b 3=c 2....

January 27, 2019 · 2 min · sunbufu

2018 年终总结

今天是 2019-01-26,等明天过完就是放假的日子了,今天坐 9 点的班车到公司,空空荡荡的,借此机会总结下我的 2018 吧。 2018 年记忆深刻的事情 1.换工作 3 月份水上德州因为政策原因不再经营,我也换了工作来到瓜子,从事供应链开发相关。 这次找工作给我带来的感触颇多,总结下。 面试题要多刷。很多知识在平时的工作中可能会用不到,但并不代表你可以不了解,等遇到的时候至少要有一个思路吧。这也就是有人说的’面试造火箭,工作拧螺丝',但是事实就是这么个理。 基础肯定要都复习一遍。下层基础决定上层建筑嘛,差距除了表面上的框架使用经验,最大的还是在基础,这也是判断一个人能否深入了解和研究的依据吧。 尽量不要去小公司了吧。不是说小公司不好,而是很多东西是小公司学不到,也没有机会让你去学的,反而装系统、装软件等很多繁琐的小事回去占据你的时间。还有一点,小公司的工作经验可能没有大公司的值钱,你的简历上肯定会写上家公司,‘某某公司前员工’可能会成为面试官给你的第一个标签。小公司可能经不太起风浪,前家公司到现在也没有跟我结清工资。 筛选公司去面试。boss、拉钩什么的软件都用起来,猎头、内推也搞起来。但是也不要海投了吧,精力不允许啊,适当的筛选下。 2.买房子 5 月份的时候去青岛看了下房子,其实在 17 年的时候我就有来看过。伏董租了辆车,带我逛了逛各个售楼处。出于多个方向的考虑,最后在城阳买了房子。然后接下来的一段时间,经常往青岛跑,什么网签、办贷款、拿合同,最后还好都顺利搞定了。9 月份的时候顺利办理了公积金的提取,一切顺利。 3.结婚证 12 月份,去了趟青岛。终于跟孙彩云把证给领了,我们恋爱了 5 年,不长也不短,感觉怎么说呢,很幸运😄。 2018 年没做的事情 1.旅游 答应带孙彩云去旅旅游,散散心。最后也没来得及做,公司的事情有点忙。 2.技术 怎么说呢,技术没有达到自己预期的那个高度吧。 2019 年要去做的事情 1.结婚 婚礼已经定了,过年回家的时候再把详细的事情看下。 2.旅游 肯定要带孙彩云出去耍耍了,不能再拖了。不能让自己一直处于一个工作,吃饭,睡觉的循环里面。人毕竟不是机器吗,偶尔懈怠下,放松一下也未尝不可了。 3.技术 技术是无止境的,刷刷题{:target="_blank"}吧。

January 26, 2019 · 1 min · sunbufu