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()方法添加新的功能,又能够很方便的修改已有的功能处理呢?
ps:转载私塾在线
相关推荐
在"第十二课 状态模式1"的学习中,我们将探讨状态模式的使用场景、使用方式以及优缺点。 一、使用场景 状态模式适用于那些对象的行为取决于其状态,并且可以根据状态变化而改变其行为的情况。例如,在视频通话的...
Java 设计模式之策略模式与状态模式 策略模式是 Java 中的一种设计模式,它主要用于解决系统与第三方接口进行数据交互的问题。当系统需要与多种格式的数据进行交互时,使用策略模式可以很好地解决这个问题。例如,...
简介状态模式的核心是封装, 状态的变更引起了行为的变更, 从外部看起来就好像这个对象对应的类发生了改变一样。解决什么问题?存在状态概念,程序需要根据状态去切换相
- **状态模式1**:可能是基础的实现,展示了如何使用Python类来封装不同的状态及其行为。 - **状态模式2(面向过程的方式-方法版)**:这可能是一种非面向对象的实现,使用函数而不是类来表示状态,通过函数指针或者...
1. **封装状态转换逻辑**:状态模式将与特定状态相关的操作封装在各自的类中,使得代码结构清晰,易于维护。 2. **增加新的状态和转换**:由于状态和转换都定义在独立的类中,因此可以轻松地添加新的状态和转换,而...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来好像对象改变了它的类。在Java中,状态模式通常通过定义不同的状态类和一个上下文类来实现,其中上下文类持有状态对象并调用其方法来响应...
本篇将探讨两种重要的行为设计模式:责任链模式(Chain of Responsibility Pattern)和状态模式(State Pattern)。 **责任链模式**是一种使多个对象都有机会处理请求的模式,避免请求发送者与接收者之间的耦合。在...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得代码更易于理解和维护。在这个实例中,我们将通过Java来深入理解并应用...
### 设计模式之状态模式详解 #### 一、设计模式概述 设计模式是软件工程领域的一种最佳实践,它提供了一套解决特定问题的通用方案。根据功能的不同,设计模式大致可以分为三大类:创建型模式、结构型模式以及行为型...
1. Context(环境类):环境类是使用状态模式的对象,它定义了客户所关心的接口,并且维持了一个对State对象的引用,这个对象代表了当前状态。 2. State(抽象状态类):这是一个接口或抽象类,定义了所有可能的状态...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得代码更易于理解和维护。在Java中,状态模式通常通过实现接口或者继承抽象...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态转换逻辑,使代码结构更清晰,易于理解和维护。 在C++中实现状态模式,我们通常会...
状态模式状态模式状态模式状态模式状态模式状态模式
状态模式是一种行为设计模式,它使对象能够在内部状态改变时改变其行为,看起来好像改变了它的类。这种模式常用于处理对象在不同状态下表现各异的情况,避免了复杂的条件语句,提高了代码的可读性和可维护性。 在...
状态模式是一种行为设计模式,它使你能在运行时改变对象的行为。在状态模式中,一个对象的状态变化可以导致其行为的变化。这种模式常用于当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变其行为的...
状态模式是一种行为设计模式,它使你能在运行时改变对象的行为。在TCP连接中,状态模式的应用尤为常见,因为TCP连接在不同的阶段会有不同的行为,比如建立连接、数据传输、断开连接等。下面我们将详细探讨这个模式...
状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使得对象看起来好像修改了它的类。这种模式通常用于当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变来改变其行为时。在这个...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且使代码结构清晰,易于维护。 在C++中,状态模式通常包含以下几个关键...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得对象的行为与其状态紧密相关,通过改变对象的状态,来改变对象的行为。 ...
状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,并且在不同的状态下,对象的行为也相应地变化。在Java中,我们可以利用接口、...