@@@模式定义:
允许一个对象在其内部状态改变时改变它的行为。
对象看起来似乎修改了它的类
@@@练习示例:
在线投票
@@@示例代码:
\pattern\VoteState.java
\pattern\NormalVoteState.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\pattern\RepeatVoteState.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\pattern\BlackVoteState.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\pattern\SpiteVoteState.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\pattern\VoteManager.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\user\Client.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@@模式的实现:
上下文持有状态对象,但是其自身并不处理跟状态相关的行为,
而是将状态处理的功能委托给了状态对应的状态处理类来处理。
@@@模式的优点:
简化应用逻辑控制;
更好地分离状态和行为;
更好的扩展性;
显式化进行状态转换;
@@@模式的缺点:
一个状态对应一个状态处理类,会使程序引入太多的状态类,
这会使程序变得杂乱。
@@@模式的本质:
根据状态来分离和选择行为。
@@@模式体现的设计原则:
NA
允许一个对象在其内部状态改变时改变它的行为。
对象看起来似乎修改了它的类
@@@练习示例:
在线投票
@@@示例代码:
\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