设计模式-状态模式
来源:互联网 发布:使用ant编译java 编辑:程序博客网 时间:2024/06/10 04:30
java-状态模式
- 介绍
允许对象在内部状态改变时改变他的行为,对象看起来好像改变修改了他的类。
将状态封装成独立的类,并实现统一的接口,并将动作委托到当前状态的对象
- 代码 注释:代码参考他人
抽象状态类
public interface VoteState { /** * 处理状态对应的行为 * @param user 投票人 * @param voteItem 投票项 * @param voteManager 投票上下文,用来在实现状态对应的功能处理的时候, * 可以回调上下文的数据 */ public void vote(String user,String voteItem,VoteManager voteManager);}
具体状态类——正常投票
public class NormalVoteState implements VoteState { @Override public void vote(String user, String voteItem, VoteManager voteManager) { //正常投票,记录到投票记录中 voteManager.getMapVote().put(user, voteItem); System.out.println("恭喜投票成功"); }}
具体状态类——重复投票
public class RepeatVoteState implements VoteState { @Override public void vote(String user, String voteItem, VoteManager voteManager) { //重复投票,暂时不做处理 System.out.println("请不要重复投票"); }}
具体状态类——恶意刷票
public class SpiteVoteState implements VoteState { @Override public void vote(String user, String voteItem, VoteManager voteManager) { // 恶意投票,取消用户的投票资格,并取消投票记录 String str = voteManager.getMapVote().get(user); if(str != null){ voteManager.getMapVote().remove(user); } System.out.println("你有恶意刷屏行为,取消投票资格"); }}
具体状态类——黑名单
public class BlackVoteState implements VoteState { @Override public void vote(String user, String voteItem, VoteManager voteManager) { //记录黑名单中,禁止登录系统 System.out.println("进入黑名单,将禁止登录和使用本系统"); }}
环境类
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; } /** * 投票 * @param user 投票人 * @param voteItem 投票的选项 */ public void vote(String user,String voteItem){ //1.为该用户增加投票次数 //从记录中取出该用户已有的投票次数 Integer oldVoteCount = mapVoteCount.get(user); if(oldVoteCount == null){ oldVoteCount = 0; } 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<9;i++){ vm.vote("u1","A"); } }}
0 0
- 设计模式:状态模式
- 设计模式-----状态模式
- 设计模式 状态模式
- 设计模式 - 状态模式
- 设计模式---状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式 - 状态模式
- 设计模式-状态模式
- 设计模式--状态模式
- 设计模式-状态模式
- 设计模式:状态模式
- 设计模式-状态模式
- 设计模式-状态模式
- [设计模式]状态模式
- 设计模式 状态模式
- 设计模式--状态模式
- 设计模式--状态模式
- LINUX中编译程序时,-I,-L,-l 的区别
- startup
- 用Eclipse运行selenium脚本时弹出浏览器导入向导设置的解决方法
- Java IO流学习总结
- 61单片机项目 - 使用C语言实现A/B口的输出
- 设计模式-状态模式
- 鼠标跟随代码,转动的文字_浏览器特效
- ISE使用总结(一)
- 发送短信及其判断是否发送成功
- TQ2440 学习笔记—— 30、移植U-Boot【U-Boot 的启动过程第一阶段源码分析】
- Thinking in java 之:内部类
- CentOS学习5_为CentOS普通用户增加sudo操作权限
- CocoaPods
- C语言函数的封装(未完待续)