设计模式之状态模式
来源:互联网 发布:营口港大数据平台 编辑:程序博客网 时间:2024/06/06 14:21
定义
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。还没有明显感觉出和策略模式有什么本质区别。书上给出的时一个是可替换的,另一个不可替换,下次再研究下。
使用场景
考虑一个在线投票系统的应用,实现一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意投票,取消该用户的投票资格,当然要取消该用户所投的票,如果一个用户投票的次数超过8次,加入黑名单,禁止再登陆和使用系统。
代码
状态接口
package state;import java.util.HashMap;import java.util.Map;public interface State { //public void vote(String user, String voteItem);//这里需要用到上下文内容 public void vote(String user, String voteItem, Context context)}
具体的状态
package state;public class NormalState implements State { @Override public void vote(String user, String voteItem, Context context) { // TODO 自动生成的方法存根 System.out.println("正常投票"); }}package state;public class RepeateState implements State { @Override public void vote(String user, String voteItem, Context context) { // TODO 自动生成的方法存根 System.out.println("请不要重复投票"); }}package state;public class EvilState implements State { @Override public void vote(String user, String voteItem, Context context) { // TODO 自动生成的方法存根 String s = context.getSmap().get(user); if (s != null) { context.getSmap().remove(user); } System.out.println("您有恶意刷票行为,取消资格"); }}package state;public class BlackState implements State { @Override public void vote(String user, String voteItem,Context ct) { // TODO 自动生成的方法存根 System.out.println("加入黑名单,将禁止登陆和使用本系统"); }}
上下文定义:
package state;import java.util.HashMap;import java.util.Map;public class Context { private State state; //投票人 投票内容(“A”) private Map<String,String> sMap = new HashMap<>(); //投票人,偷票次数 private Map<String,Integer> iMap = new HashMap<>(); public Map<String,String> getSmap() { return sMap; } public void handle(String user,String voteItem) { //System.out.println("Hello world"); //这里将Integer写成int回报空指针异常错误 Integer count = iMap.get(user); if (count == null) { count = 0; } count++; iMap.put(user, count); if (count == 1) { state = new NormalState(); } else if (count > 1 && count < 5 ) { state = new RepeateState(); } else if (count >= 5 && count <= 8) { state = new EvilState(); } else if (count >= 8) { state = new BlackState(); } state.vote(user,voteItem,this); }}
客户端测试:
package state;public class Client { public static void main(String[] args) { Context ct= new Context(); for (int i = 0;i < 9;i++) { ct.handle("小李", "A"); } }}
运行结果:
正常投票
请不要重复投票
请不要重复投票
请不要重复投票
您有恶意刷票行为,取消资格
您有恶意刷票行为,取消资格
您有恶意刷票行为,取消资格
您有恶意刷票行为,取消资格
加入黑名单,将禁止登陆和使用本系统
阅读全文
0 0
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之--状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 【设计模式】之状态模式
- 数字根
- jquery:AJAX 获取外部json
- RocketMQ源码解析-Producer启动
- Java static(三)
- 水仙花数
- 设计模式之状态模式
- jsp中获取根路径的方法
- 关于野指针,freopen重定向以及cin的简单c++问题
- 游戏工程架构设计
- sdnu1070
- Java项目使用Swagger开发包含文档的API接口
- php-cli模式学习(PHP命令行模式)
- 求两个整数之间的所有素数
- Palindrome Number(算法分析week6)