前提:含环境类、状态接口、具体状态类。将每个状态实现为一个对象即行为。(ps: 没想到更啥,先更着以前写的状态模式吧。。。。)
1 状态接口:
public interface VoteState {
/**
* 处理对应状态的行为
* @param user [投票人]
* @param voteItem [投票项]
* @param voteManager [环境类]
*/
public void vote(String user, String voteItem, VoteManager voteManager);
}
2 具体状态类:
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("进入黑名单,将禁止登录和使用本系统");
}
}
3 环境类:
public class VoteManager {
//持有状态处理对象
private VoteState state = null;
//记录用户投票的结果,Map<String,String>对应Map<用户名称,投票的选项>
private Map<String,String> mapVote = new HashMap<>();
//记录用户投票次数,Map<String,Integer>对应Map<用户名称,投票的次数>
private Map<String,Integer> mapVoteCount = new HashMap<>();
/**
* 获取用户投票结果的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);
}
}
4 用法:
public static void main(String[] args) {
VoteManager vm = new VoteManager();
for(int i=0;i<9;i++){
vm.vote("u1","A");
}
}
标签:oldVoteCount,状态,String,voteItem,模式,投票,设计模式,public,user From: https://blog.51cto.com/u_13854513/6127522