状态模式

状态模式(State)

状态模式是行为模式之一,状态模式允许通过改变对象的内部状态而改变对象的行为,这个对象表现得就好像修改了它的类一样。

1. 状态模式中角色及其职责

1.1 用户对象(Context)

拥有一个State类型的成员,以标识对象的当前状态

Main

package com.liuyao;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public class VoteManager {
    private VoteState voteState;
    //记录用户投票的结果,Map<String,String>对应Map<用户名称,投票的选项>
    private Map<String ,String > mapVote=new HashMap<>();
    //记录用户投票次数,Map<String,Integer>对应Map<用户名称,投票的次数>
    private Map<String,Integer> mapUserCount=new HashMap<>();
    public Map<String, String> getMapVote() {
        return mapVote;
    }

    public void vote(String user,String voteItem){
        //1.为该用户增加投票次数
        //从记录中取出该用户已有的投票次数
        Integer oldVoteCount=mapUserCount.get(user);
        if (oldVoteCount==null){
            oldVoteCount=0;
        }
        oldVoteCount+=1;
        mapUserCount.put(user,oldVoteCount);

        if (oldVoteCount==1){
            voteState=new NormalVoteState();
        } else if (oldVoteCount > 1 && oldVoteCount < 5){
            voteState=new NoRepeatVoteState();
        }else {
            voteState=new BlackVoteState();
        }

        //然后转调状态对象来进行相应的操作
        voteState.vote(user,voteItem,this);
    }
}

1.2 抽象状态角色(State)

定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。

VoteState

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public interface VoteState {
    public void vote(String user,String voteItem,VoteManager voteManager);
}

1.3 具体状态角色(Concrete State)

每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

NormalVoteState

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public class NormalVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        voteManager.getMapVote().put(user,voteItem);
        System.out.println("投票成功");
    }
}

NoRepeatVoteState

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public class NoRepeatVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        System.out.println("请不要重复投票");
    }
}

BluckVoteState

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/05
 */
public class BlackVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        System.out.println("进入黑名单");
    }
}

Main

package com.liuyao;

public class Main {

    public static void main(String[] args) {
   // write your code here

        VoteManager vm = new VoteManager();
        for(int i=0;i<5;i++){
            vm.vote("u1","A");
        }
    }
}

//投票成功
//请不要重复投票
//请不要重复投票
//请不要重复投票
//进入黑名单

2. 应用场景

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值