状态模式


1. 类图

image.png

  • Context:上下文,封装不同的状态
  • State:封装与上下文的一个特定状态所对应的行为
  • ConcreteState:具体的状态处理类

2. 示例

根据状态分离和选择行为

2.1 上下文

public class VoteContext {

    // 存放投票结果
    private Map<String,String> resultMap = new HashMap<>();
    // 存放投票次数
    private Map<String,Integer> countMap = new HashMap<>();
    // 黑名单
    private List<String> black = new ArrayList<>();

    public Map<String,String> getResultMap(){
        return resultMap;
    }

    public List<String> getBlack(){
        return black;
    }

    public boolean isBlack(String user){
        return black.contains(user);
    }

    public void vote(String user, String voteItem){
        // 黑名单用户禁止投票
        assert isBlack(user):"用户禁止投票!!";

        // 获取用户投票次数
        Integer count = countMap.get(user);
        if (count == null) {
            count = 0;
        }
        ++count;
        VoteState voteState = null;
        if (count == 1) {
            voteState = new NormalVoteState();
        } else if (count > 1 && count <= 5) {
            voteState = new RepeatVoteState();
        } else {
            voteState = new BlackVoteState();
        }

        voteState.vote(user,voteItem,this);
        countMap.put(user,count);
    }
}

2.2 状态处理接口

public interface VoteState {
    void vote(String user,String voteItem, VoteContext context);
}

2.3 状态处理实现

public class NormalVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteContext context) {
        context.getResultMap().put(user,voteItem);
        System.out.println("用户:" + user + " 投票成功!!!");
    }
}

public class RepeatVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteContext context) {
        System.out.println("请不要重复投票!!!");
    }
}

public class BlackVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteContext context) {
        String item = context.getResultMap().get(user);
        if (item != null) {
            // 取消投票
            context.getResultMap().remove(user);
            // 添加黑名单
            context.getBlack().add(user);
        }
        System.out.println("发现恶意投票行为,取消投票资格");
    }
}

2.4 客户端

public class Client {
    public static void main(String[] args) {
        VoteContext voteContext = new VoteContext();
        for (int i = 0; i < 7; i++) {
            voteContext.vote("hiloj", "赞成票");
        }
    }
}

3. 优点

  • 简化应用逻辑控制
  • 状态和行为分离
  • 更好的扩展性

4. 缺点

  • 一个状态对应一个处理类,需要引入很多的类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值