設計模式之狀態模式

前提:含環境類、狀態接口、具體狀態類。將每個狀態實現爲一個對象即行爲。(ps: 沒想到更啥,先更着以前寫的狀態模式吧。。。。)
 
1 狀態接口:
public interface VoteState {
 
    /**
    * 處理對應狀態的行爲
    * @param user [投票人]
    * @param voteItem [投票項]
    * @param voteManager [環境類]
    */
    public void vote(String user, String voteItem, VoteManager voteManager);
}
 
2 具體狀態類:
public class NormalVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        //正常投票,記錄到投票記錄中
        voteManager.getMapVote().put(user, voteItem);
        System.out.println("恭喜投票成功");
    }
}
//----------------------------------------------------------------------------------
public class RepeatVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        //重複投票,暫時不做處理
        System.out.println("請不要重複投票");
    }
}
//----------------------------------------------------------------------------------
public class SpiteVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        // 惡意投票,取消用戶的投票資格,並取消投票記錄
        String str = voteManager.getMapVote().get(user);
        if(str != null){
            voteManager.getMapVote().remove(user);
        }
        System.out.println("你有惡意刷屏行爲,取消投票資格");
    }
}
//----------------------------------------------------------------------------------
public class BlackVoteState implements VoteState {
    @Override
    public void vote(String user, String voteItem, VoteManager voteManager) {
        //記錄黑名單中,禁止登錄系統
        System.out.println("進入黑名單,將禁止登錄和使用本系統");
    }
}
 
3 環境類:
public class VoteManager {
 
    //持有狀態處理對象
    private VoteState state = null;
    //記錄用戶投票的結果,Map<String,String>對應Map<用戶名稱,投票的選項>
    private Map<String,String> mapVote = new HashMap<>();
    //記錄用戶投票次數,Map<String,Integer>對應Map<用戶名稱,投票的次數>
    private Map<String,Integer> mapVoteCount = new HashMap<>();
    /**
    * 獲取用戶投票結果的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(oldVoteCount == null){
            oldVoteCount = 0;
        }
        oldVoteCount += 1;
        mapVoteCount.put(user, oldVoteCount);
        //2.判斷該用戶的投票類型,就相當於判斷對應的狀態
        //到底是正常投票、重複投票、惡意投票還是上黑名單的狀態
        if(oldVoteCount == 1){
            state = new NormalVoteState(); //正常投票
        else if(oldVoteCount > 1 && oldVoteCount < 5){
            state = new RepeatVoteState(); //重複投票
        else if(oldVoteCount >= 5 && oldVoteCount <8){
            state = new SpiteVoteState(); //惡意刷票
        else if(oldVoteCount > 8){
            state = new BlackVoteState(); //拉黑名單
        }
        //然後轉調狀態對象來進行相應的操作
        state.vote(user, voteItem, this);
    }
}
 
4 用法:
public static void main(String[] args) {
    VoteManager vm = new VoteManager();
    for(int i=0;i<9;i++){
        vm.vote("u1","A");
    }
}
 
 
 
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章