状态模式(State)

@@@模式定义:
允许一个对象在其内部状态改变时改变它的行为。
对象看起来似乎修改了它的类

@@@练习示例: 
在线投票

@@@示例代码:
\pattern\VoteState.java

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

/**
 * 封装一个投票状态相关的行为
 */
public interface VoteState {
    /**
     * 处理状态对应的行为
     * @param user 投票人
     * @param voteItem 投票项
     * @param voteManager 投票上下文,用来在实现状态对应的
     * 功能处理的时候,可以回调上下文的数据
     */
	public void vote(String user, String voteItem, 
			VoteManager voteManager);
}

\pattern\NormalVoteState.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

public class NormalVoteState implements VoteState {
	@Override
	public void vote(String user, String voteItem, 
			VoteManager voteManager) {
		// 正常投票
		// 记录到投票记录中
		voteManager.getMapVote().put(user, voteItem);
		System.out.println("恭喜你投票成功");
	}
}

\pattern\RepeatVoteState.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

public class RepeatVoteState implements VoteState {
	@Override
	public void vote(String user, String voteItem, 
			VoteManager voteManager) {
		// 重复投票
		// 暂时不做处理
		System.out.println("请不要重复投票");
	}
}

\pattern\BlackVoteState.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

public class BlackVoteState implements VoteState {
	@Override
	public void vote(String user, String voteItem, 
			VoteManager voteManager) {
		// 黑名单
		// 计入黑名单中,禁止登录系统了
		System.out.println("进入黑名单,将禁止登录和使用本系统");
	}
}

\pattern\SpiteVoteState.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

public class SpiteVoteState implements VoteState {
	@Override
	public void vote(String user, String voteItem, 
			VoteManager voteManager) {
		// 恶意投票
		// 取消用户投票资格,并取消投票记录
		String s = voteManager.getMapVote().get(user);
		if (s != null) {
			voteManager.getMapVote().remove(user);
		}
		System.out.println("你有恶意刷票行为,取消投票资格");
	}
}

\pattern\VoteManager.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package pattern;

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

/**
 * 投票管理
 */
public class VoteManager {
    /**
     * 持有状态处理对象
     */
	private VoteState state = null;
	
	/**
	 * 记录用户投票的结果,
	 * MAP<String, String>对应Map<用户名称, 投票的选项>
	 */
	private Map<String, String> mapVote = 
		new HashMap<String, String>();
	
	/**
	 * 记录用户投票次数,
	 * Map<String, Integer>对应Map<用户名称, 投票的次数>
	 */
	private Map<String, Integer> mapVoteCount =
		new HashMap<String, Integer>();
    
	/**
	 * 获取记录用户投票结果的Map
	 * @return 记录用户投票结果的Map
	 */
	public Map<String, String> getMapVote() {
		return mapVote;
	}
	
	/**
	 * 投票
	 * @param user 投票人,为了简单,就是用户名称
	 * @param voteItem 投票的选项
	 */
	public void vote(String user, String voteItem) {
		// 1:先为该用户增加投票的次数
		// 从记录中取出已有的投票次数
		Integer oldVoteCount = mapVoteCount.get(user);
		if (null == oldVoteCount) {
			oldVoteCount = 0;
		}
		oldVoteCount = oldVoteCount + 1;
		mapVoteCount.put(user, oldVoteCount);
		
		// 2:判断该用户投票的类型,就相当于是判断对应的状态
		// 到底是正常投票、重复投票、恶意投票还是上黑名单的状态
		if (1 == oldVoteCount) {
			state = new NormalVoteState();
		} else if (1 < oldVoteCount && oldVoteCount < 5) {
			state = new RepeatVoteState();
		} else if (5 <= oldVoteCount && oldVoteCount < 8) {
			state = new SpiteVoteState();
		} else if (8 <= oldVoteCount) {
			state = new BlackVoteState();
		} else {
			// ERROR
		}
		
		// 然后转调状态对象来进行相应的操作
		state.vote(user, voteItem, this);
	}
}

\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package user;

import pattern.VoteManager;

public class Client {
    public static void main(String[] args) {
    	VoteManager vm = new VoteManager();
    	for (int i = 0; i < 8; i++) {
    		vm.vote("u1", "A");
    	}
    }
}

@@@模式的实现:
上下文持有状态对象,但是其自身并不处理跟状态相关的行为,
而是将状态处理的功能委托给了状态对应的状态处理类来处理。

@@@模式的优点:
简化应用逻辑控制;
更好地分离状态和行为;
更好的扩展性;
显式化进行状态转换;

@@@模式的缺点:
一个状态对应一个状态处理类,会使程序引入太多的状态类,
这会使程序变得杂乱。

@@@模式的本质:
根据状态来分离和选择行为。

@@@模式体现的设计原则:
NA


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值