状态模式(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. 应用场景
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表现不同状态的一系列类当中,可以把复杂的判断逻辑简化。