【设计模式】-状态模式

投票接口

/**
 * 投票状态行为
 * 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.适用场景:对象行为取决于状态;一个操作中含有庞大的多分支语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值