1. 类图
- 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. 缺点
- 一个状态对应一个处理类,需要引入很多的类