投票接口
/**
* 投票状态行为
* 1.一个用户只能投一票,可容忍不超过5次的无恶意的投票
* 2.一个用户投票次数不能超过5次,超过5次则为恶意刷票,
* 3.超过8次则进入黑名单
*/
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.getUserWithDo().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 HateVoteState implements VoteState{
@Override
public void vote(String user, String voteItem, VoteManager voteManager) {
//取消投票资格--删除投票记录
String voteItems = voteManager.getUserWithDo().get(user);
if (voteItems!=null){
voteManager.getUserWithDo().remove(user);
}
System.out.println("消投票资格");
}
}
小黑屋处理
public class BlackHomeState implements VoteState{
@Override
public void vote(String user, String voteItem, VoteManager voteManager) {
System.out.println("进入小黑屋面壁");
}
}
投票管理器
import java.util.HashMap;
import java.util.Map;
/**
* 投票管理器--对外
*/
public class VoteManager {
//用户--投票
private static Map<String,String> userWithDo=new HashMap<>();
//用户投票次数
private static Map<String,Integer> userWithVoteNumber=new HashMap<>();
public void vote(String user,String voteItem){
//更新投票次数
Integer number = userWithVoteNumber.get(user);
if (number==null){
number=0;
}
number++;
userWithVoteNumber.put(user,number);
VoteState voteState = null;
if (1==number){
voteState=new NormalVoteState();
}else if(number>1 && number<5){
voteState=new RepeatVoteState();
}else if(number>=5 && number<8){
voteState=new HateVoteState();
}else if(number>=8){
voteState=new BlackHomeState();
}
voteState.vote(user,voteItem,this);
}
public Map<String, String> getUserWithDo() {
return userWithDo;
}
}
总结
1.定义:类的行为是基于它的内部状态改变的,看起来似乎修改了类。
2.本质:根据状态分离选择行为
3.适用场景:对象行为取决于状态;一个操作中含有庞大的多分支语句。