在超市看到一个好玩的东西,好吧是我少见多怪了,就是一个普普通的供顾客临时存放东西储物柜,不过跟我以前见过的不大一样,等人无聊的时候我就开始瞎想了,我见过的大概有这么几种:
第一种是使用密码的,存物的时候先按“存”按钮,然后随机分配一个柜子,然后输入密码,这种应该是比较常见的,取的时候需要柜子号和密码认证身份。第二种是使用凭条的,先按存按钮,然后分配一个柜子再打印一个凭条(出凭条口),取的时候需要凭条(塞入读凭条口)。第三种是在图书馆看到的,这个就比较高端了,是使用的ID卡认证,是跟学校的一卡通关联起来的,存的时候刷一下,滴,开,取的时候刷一下,滴,开,都不带选择存还是取的,还是蛮智能的。
来分析一下它们的工作原理(顺带yy一下如果是我的话我会怎么设计):第一种使用密码认证的,布局大致如下(不同厂商肯定会有所不同,但是想一下屏幕肯定都会在平均身高的肩膀位置吧,总不能屏幕位置跟膝盖对齐吧....):
使用凭条的大概长这样子:
ID卡认证的大概是这个样子:
我没接触过单片机,不知道这种东西代码怎么写,但是想来原理应该是差不读的,无非是资源分配和回收(而且还是单线程),首先应该确定的是:
1.已分配资源的管理方式2.未分配资源的管理方式
这里的资源指的是柜子,已分配的资源可以使用一个Map映射表:
Map<使用者标识,柜子编号>map=newHashMap<>();未分配的柜子存储数据结构:
Queue<柜子编号>queue=newQueue<>();初始状态下所有柜子都在未分配队列中,每当要分配的时候就看一下,如果队列为空的话说明柜子已经分配完了,否则的话就从队头分配一个柜子,同时增加一个<使用者身份标识,柜子编号>项,这应该是一个原子性操作:
1.移除queue队头元素。2.增加map映射项。当然别忘了把柜子打开让人家把东西放进来。
当取的时候也比较简单,就是从map中的keySet中找一下有没有对应的项,如果木有,你肯定是假冒的了,如果有的话,首先把柜子给人家打开让人先把东西取走,然后在取走关上柜子的时候执行如下操作:
1.删除map中的对应的映射项。2.将<使用者标识,柜子编号>中的柜子编号插入到queue的队尾,这个柜子可以重新分配了。以上两步也应该是一个原子性操作。
然后就是身份标识了,关于密码的没什么好说的,直接使用一个六位数的字符串就可以,使用密码标识的缺点是需要人脑记忆,记忆的部分包括柜子号和密码,忘了就惨了。