`
jendgh
  • 浏览: 16687 次
  • 性别: Icon_minigender_2
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

研磨设计模式 之 状态模式(State)1——跟着cc学设计系列

 
阅读更多

18.1  场景问题

18.1.1  实现在线投票

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

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

18.1.2  不用模式的解决方案

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

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

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

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

/**

 * 投票管理

 */

public class VoteManager {

    /**

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

     */

    private Map<String,String> mapVote =

new HashMap<String,String>();

    /**

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

     */

    private Map<String,Integer> mapVoteCount =

new HashMap<String,Integer>();

    /**

     * 投票

     * @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()方法添加新的功能,又能够很方便的修改已有的功能处理呢?

 

---------------------------------------------------------------------------

私塾在线学习网原创内容  跟着cc学设计系列 之 研磨设计模式

 

原创内容,转载请注明出处【http://sishuok.com/forum/blogPost/list/5619.html

---------------------------------------------------------------------------

0
0
分享到:
评论

相关推荐

    研磨设计模式源码

    《研磨设计模式源码》是一份非常宝贵的资源,它提供了设计模式的实践代码,帮助开发者深入理解并应用这些模式。设计模式是软件工程中经过长期实践总结出来的一套通用解决方案,它们描述了在特定场景下如何解决常见...

    研磨设计模式(完整带书签).part2.pdf

    第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24...

    研磨设计模式带书签完整版228M.7z.001

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式PDF

    《研磨设计模式》这本书是陈臣和王斌两位作者合作的成果,专注于讲解软件设计中的模式应用。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决问题的常见方法,使得开发者可以复用这些解决方案,提高...

    研磨设计模式高清完整版(1)

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式 完美书签 完整(一)

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式带书签完整版228M.7z.002

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式博文集

    如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、责任链模式(Chain of Responsibility)、备忘录模式(Memento)、状态模式...

    研磨设计模式(完整版pdf) part1 (1-3)

    研磨设计模式(完整版pdf)相信我不用介绍,很多人都在找这本书吧,今天我特意从另外的地方下载到了这本书,发了几十积分。才弄到。为了让大家同时分享这本书的精华。我今天特意上传。注:此电子书较大,我分了3个...

    研磨设计模式-陈臣.epub

    “1.1 设计模式是什么 1.1.1 什么是模式 ...1.设计模式是解决方案 根据上面对设计模式的定义可以看出,归根结底,设计模式就是一些解决方案。” 摘录来自: 陈臣. “研磨设计模式”。 iBooks.

    X-gen PPT下载——《研磨设计模式》 实战

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    研磨设计模式[书签]

    《研磨设计模式》是由陈臣和王斌合著,由清华大学出版社出版的一本深入探讨设计模式的专业书籍。设计模式是软件工程中的一个重要概念,它代表了在特定上下文中解决问题的常见方法,经过时间和实践的验证,具有很高的...

    研磨设计模式(完整带书签).part1.pdf

    第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式(Chain of Responsibility) 第24...

    研磨设计模式 源代码

    《研磨设计模式》是一本深入探讨软件设计模式的经典书籍,源代码包含了书中所讲解的各种设计模式的实际应用示例。设计模式是软件工程中的重要概念,它们是经过反复验证、在特定情境下解决常见问题的有效解决方案。...

    研磨设计模式全部源代码

    这个压缩包“研磨设计模式全部源代码”包含了多种设计模式的实现,这些模式可以帮助开发者写出更可维护、可扩展和可复用的代码。下面将详细讲解其中可能包含的一些重要设计模式及其应用。 1. 工厂模式:这是最简单...

    研磨设计模式视频课程PPT

    内容概述:本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制 课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力 ...

    研磨设计模式.rar

    《研磨设计模式》这本书是软件开发领域中的经典之作,主要关注的是面向对象设计中的设计模式。设计模式是在特定上下文中解决常见问题的最佳实践,它为开发者提供了在类似情况下重复使用解决方案的模板,有助于提高...

    研磨设计模式讲课PPT

    研磨设计模式是一本深入探讨软件设计原则与实践的书籍,其讲课PPT为我们提供了丰富的设计模式知识。设计模式是软件工程中经过实践验证的、解决常见问题的模板,是经验丰富的开发人员智慧的结晶。这些模式可以帮助...

    研磨设计模式带书签完整版228M.7z.003

    研磨设计模式《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地...

    研磨设计模式书-配套源代码(全)

    0该书是《研磨设计模式》,只有前几张,网上完整版电子书还没有,这是本人收集的最完备的,最多的前几章。 1:本源代码是《研磨设计模式》一书的配套源代码 2:每个模式的示例源代码放在一个单独的文件夹下,以该...

Global site tag (gtag.js) - Google Analytics