Chinaunix首页 | 论坛 | 博客
  • 博客访问: 88854
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 281
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-02 18:00
文章分类
文章存档

2014年(29)

我的朋友

分类: 网络与安全

2014-01-25 11:21:32

18.1.1  实现在线投票

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

该怎么实现这样的功能呢?
18.1.2  不用模式的解决方案

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

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

    一是用户是正常投票
    二是用户正常投票过后,有意或者无意的重复投票
    三是用户恶意投票
    四是黑名单用户

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

/**

 * 投票管理

 */

public class VoteManager {

    /**

     * 记录用户投票的结果,Map对应Map<用户名称,投票的选项>

     */

    private Map mapVote =

new HashMap();

    /**

     * 记录用户投票次数,Map对应Map<用户名称,投票的次数>

     */

    private Map mapVoteCount =

new HashMap();

    /**

     * 投票

     * @param user 投票人,为了简单,就是用户名称

     * @param voteItem 投票的选项

     */

    public void vote(String user,String voteItem){

       //1:先为该用户增加投票的次数

       //先从记录中取出已有的投票次数

       Integer oldVoteCount = mapVoteCount.get(user);

       if(oldVoteCount==null){

           oldVoteCount = 0;

       }

       oldVoteCount = oldVoteCount + 1;

       mapVoteCount.put(user, oldVoteCount);

      

       //2:判断该用户投票的类型,到底是正常投票、重复投票、恶意投票

//还是上黑名单,然后根据投票类型来进行相应的操作  

       if(oldVoteCount==1){

           //正常投票

           //记录到投票记录中

           mapVote.put(user, voteItem);

           System.out.println("恭喜你投票成功");

       }else if(oldVoteCount>1 && oldVoteCount<5){

           //重复投票

           //暂时不做处理

           System.out.println("请不要重复投票");

       }else if(oldVoteCount >= 5 && oldVoteCount<8){

           //恶意投票

           //取消用户的投票资格,并取消投票记录

           String s = mapVote.get(user);

           if(s!=null){

              mapVote.remove(user);

           }

           System.out.println("你有恶意刷票行为,取消投票资格");

       }else if(oldVoteCount>=8){

           //黑名单

           //记入黑名单中,禁止登录系统了

           System.out.println("进入黑名单,将禁止登录和使用本系统");

       }

    }

}

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

public class Client {

    public static void main(String[] args) {

       VoteManager vm = new VoteManager();

       for(int i=0;i<8;i++){

           vm.vote("u1", "A");

       }

    }

}

运行结果如下:

恭喜你投票成功

请不要重复投票

请不要重复投票

请不要重复投票

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

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

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

进入黑名单,将禁止登录和使用本系统
18.1.3  有何问题

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

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

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

不管哪一种情况,都是在一大堆的控制代码里面找出需要的部分,然后进行修改,这从来都不是好方法,那么该如何实现才能做到:既能够很容易的给vote()方法添加新的功能,又能够很方便的修改已有的功能处理呢?
阅读(1052) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~