public interface VoteState {//处理状态对应的行为 public void vote(String user,String voteItem,VoteManager voteManager);
}public class SpiteVoteState implements VoteState{public void vote(String user, String voteItem, VoteManager voteManager) {//恶意投票//取消用户的投票资格,并取消投票记录String s = voteManager.getMapVote().get(user);if(s!=null){voteManager.getMapVote().remove(user);}System.out.println("你有恶意刷票行为,取消投票资格");}
}public class RepeatVoteState implements VoteState{public void vote(String user, String voteItem, VoteManager voteManager) {//重复投票//暂时不做处理System.out.println("请不要重复投票");}
}public class NormalVoteState2 extends NormalVoteState{public void vote(String user, String voteItem, VoteManager voteManager) {//先调用已有的功能super.vote(user, voteItem, voteManager);//给予积分奖励,示意一下System.out.println("奖励积分10分");}
}public class BlackWarnVoteState implements VoteState{public void vote(String user, String voteItem, VoteManager voteManager) {//待进黑名单警告状态System.out.println("禁止登录和使用系统3天");}
}public class VoteManager {//持有状态处理对象 private VoteState state = null;//记录用户投票的结果,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>();// 获取记录用户投票结果的Map public Map<String, String> getMapVote() {return mapVote;}//投票 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){state = new NormalVoteState();}else if(oldVoteCount>1 && oldVoteCount<5){state = new RepeatVoteState();}else if(oldVoteCount >= 5 && oldVoteCount<8){state = new SpiteVoteState();}else if(oldVoteCount>=8){state = new BlackVoteState();}//然后转调状态对象来进行相应的操作state.vote(user, voteItem, this);}
}public class Client {public static void main(String[] args) {VoteManager vm = new VoteManager();for(int i=0;i<8;i++){vm.vote("u1", "A");}}
}

《研磨设计模式》chap18 状态模式state(3)应用到场景相关推荐

  1. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  2. C++设计模式之状态模式(state)(行为型)

    一 定义 状态模式:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况.把不同状态的操作分散到不同的状态对象 ...

  3. 设计模式之状态模式(State)

    什么是状态? 我们在购物网站进行购物时,订单会产生几种状况:已下单.已付款.送货中.确定收货等状态. 所以系统会判断该订单的状态,不管是哪种状态都应给出对应的操作,这就是状态. 什么是状态模式? 在软 ...

  4. 《研磨设计模式》chap18 状态模式state(1)模式简介

    场景:投票管理 1. 正常编码 //投票管理 public class VoteManager {//记录用户投票的结果,Map<String,String>对应Map<用户名称,投 ...

  5. 设计模式之状态模式(State)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. 《研磨设计模式》chap18 状态模式state(2)模式介绍

    1. 状态的平行性 与策略模式的不同,策略模式的行为是平等的 2. 上下文和状态处理对象 上下文是持有状态的对象,但是上下文自身并不处理跟状态相关的行为,而是把处理状态的功能委托给了状态对应的状态处理 ...

  7. 《研磨设计模式》chap18 状态模式state(4)例子

    public class StateMachine {//持有一个状态对象 private State state = null;//包含流程处理需要的业务数据对象,不知道具体类型,用Object,反 ...

  8. php 状态模式,PHP设计模式(十九)—状态模式 (State Pattern)

    状态模式 (State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for States) (一)为什么需要状态模式 ...

  9. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

最新文章

  1. 【JavaScript从入门到精通】第一课 初探JavaScript魅力-01
  2. python多进程存储数据_Python 多进程及进程间通信
  3. windows popen 获取不到输出_彻底明白os.system、os.popen、subprocess.popen的用法和区别...
  4. 页面未加载完时报的错误
  5. miui微博html5版关闭,MIUI10迎来最后一波开发版推送 可关闭广告消息
  6. c语言删掉注释,c语言删除注释
  7. android设计风格是什么软件下载,基于MaterialDesign设计风格的妹纸app的简单实现
  8. exception e 是泛类吗_Spring异步编程 | 你的@Async就真的异步吗?异步历险奇遇记
  9. Python:functools.cmp_to_key(func)使用
  10. Bigemap中添加离线地图数据包 教程
  11. 光伏产品标准 - IEC 61215:2021版系列简介及标准下载
  12. python 分词 词性_pyhanlp——分词与词性标注
  13. android wear 微信支付,智能手表不是鸡肋 Pacewear能刷微信支付宝结账
  14. 类似于萝卜书摘的书摘app推荐
  15. YOLOv5-7.0解决No module named ‘utils.datasets‘和cannot import name ‘scale_coords‘ from ‘utils.general‘
  16. 用js处理打卡记录excel表
  17. 【算法提高—蓝桥杯】阮小二买彩票
  18. 指针数组,数组指针,函数指针的区别
  19. 有天跟朋友一起聊天的感受
  20. Excel财务会计报表

热门文章

  1. java获取当前tomcat线程pid_java 查看tomcat线程信息(示例代码)
  2. php执行只读文件,php实现以只读方式打开文件的方法
  3. 配电基础知识汇总,99%的人都收藏了!
  4. 乱乱乱!那些惨不忍睹的机房布线
  5. 成功解决无法连接到YLMF-201404228CG,在建立与服务器的连接时出错。在连接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败
  6. ML之catboost:基于自带Pool数据集实现二分类预测
  7. Dataset:(公交车、恐龙、大象、花朵、骏马)六类图片数据集(AutoKeras测试)的简介、下载、使用方法之详细攻略
  8. DL之SPP-Net:SPP-Net算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  9. javascript闭包学习
  10. 看似简单但容易忽视的编程常识