18.1 场 景 问 题

18.1.1 实现在线投票

考虑一个在线投票的应用,要实现控制同一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意刷票,要取消该用户投票的资格,当然同时也要取消他所投的票;如果一个用户的投票次数超过8次,将进入黑名单,禁止再登录和使用系统。

该怎么实现这样的功能呢?

18.1.2 不用模式的解决方案

分析上面的功能,为了控制用户投票,需要记录用户所投票的记录,同时还要记录用户投票的次数,为了简单,直接使用两个Map来记录。

在投票的过程中,又有四种情况:

■ 用户是正常投票。

■ 用户正常投票以后,有意或者无意地重复投票。

■ 用户恶意投票。

■ 黑名单用户。

这几种情况下对应的处理是不一样的。看看代码吧。示例代码如下:

07516cee7c214a5da72627bc3e11074f

d0311693a9304a2686359f5f7d4f293f

5107afcd26374b6fa6b0b4813bb32360

写个客户端来测试看看,是否能满足功能要求。示例代码如下:

1a97a9f350e448f08b6389dcd13503cb

9cdc8c113e884151b2031f83bfc11d74

运行结果如下:

恭喜你投票成功

请不要重复投票

请不要重复投票

请不要重复投票

你有恶意刷票行为,取消投票资格

你有恶意刷票行为,取消投票资格

你有恶意刷票行为,取消投票资格

进入黑名单,将禁止登录和使用本系统

18.1.3 有何问题

看起来很简单,是不是?幸亏这里只是示意,否则,你想想,在vote()方法中那么多判断,还有每个判断对应的功能处理都放在一起,是不是有点太杂乱了,那简直就是个大杂烩,如果把每个功能都完整地实现出来,那vote()方法会很长的。

一个问题是,如果现在要修改某种投票情况所对应的具体功能处理,那就需要在那个大杂烩中,找到相应的代码块,然后进行改动。

另外一个问题是,如果要添加新的功能,比如投票超过8次但不足10次的,给个机会,只是禁止登录和使用系统3天,如果再犯,才永久封掉账号,该怎么办呢?那就需要改动投票管理的源代码,在上面的if-else结构中再添加一个elseif块进行处理。

不管哪一种情况,都是在一大堆的控制代码中找出需要的部分,然后进行修改,这不是个好方法。那么该如何实现才能做到:既能够很容易地给vote()方法添加新的功能,又能够很方便地修改已有的功能处理呢?