国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

(十一)狀態(tài)模式

2019-11-08 18:40:03
字體:
供稿:網(wǎng)友

狀態(tài)模式允許一個對象在其內(nèi)部狀態(tài)改變的時候改變其行為。這個對象看上去就像是改變了它的類一樣。

這里寫圖片描述

環(huán)境(Context)角色,也成上下文:定義客戶端所感興趣的接口,并且保留一個具體狀態(tài)類的實例。這個具體狀態(tài)類的實例給出此環(huán)境對象的現(xiàn)有狀態(tài)。

抽象狀態(tài)(State)角色:定義一個接口,用以封裝環(huán)境(Context)對象的一個特定的狀態(tài)所對應(yīng)的行為。

具體狀態(tài)(ConcreteState)角色:每一個具體狀態(tài)類都實現(xiàn)了環(huán)境(Context)的一個狀態(tài)所對應(yīng)的行為。

考慮一個在線投票系統(tǒng)的應(yīng)用,要實現(xiàn)控制同一個用戶只能投一票,如果一個用戶反復(fù)投票,而且投票次數(shù)超過5次,則判定為惡意刷票,要取消該用戶投票的資格,當(dāng)然同時也要取消他所投的票;如果一個用戶的投票次數(shù)超過8次,將進入黑名單,禁止再登錄和使用系統(tǒng)。

  要使用狀態(tài)模式實現(xiàn),首先需要把投票過程的各種狀態(tài)定義出來,根據(jù)以上描述大致分為四種狀態(tài):正常投票、反復(fù)投票、惡意刷票、進入黑名單。然后創(chuàng)建一個投票管理對象(相當(dāng)于Context)。

抽象類:

public interface VoteState { /** * 處理狀態(tài)對應(yīng)的行為 * @param user 投票人 * @param voteItem 投票項 * @param voteManager 投票上下文,用來在實現(xiàn)狀態(tài)對應(yīng)的功能處理的時候, * 可以回調(diào)上下文的數(shù)據(jù) */ public void vote(String user,String voteItem,VoteManager voteManager);}

四種狀態(tài)類

public class NormalVoteState implements VoteState { @Override public void vote(String user, String voteItem, VoteManager voteManager) { //正常投票,記錄到投票記錄中 voteManager.getMapVote().put(user, voteItem); System.out.Context類

public class VoteManager { //持有狀體處理對象 private VoteState state = null; //記錄用戶投票的結(jié)果,Map<String,String>對應(yīng)Map<用戶名稱,投票的選項> private Map<String,String> mapVote = new HashMap<String,String>(); //記錄用戶投票次數(shù),Map<String,Integer>對應(yīng)Map<用戶名稱,投票的次數(shù)> private Map<String,Integer> mapVoteCount = new HashMap<String,Integer>(); /** * 獲取用戶投票結(jié)果的Map */ public Map<String, String> getMapVote() { return mapVote; } /** * 投票 * @param user 投票人 * @param voteItem 投票的選項 */ public void vote(String user,String voteItem){ //1.為該用戶增加投票次數(shù) //從記錄中取出該用戶已有的投票次數(shù) Integer oldVoteCount = mapVoteCount.get(user); if(oldVoteCount == null){ oldVoteCount = 0; } oldVoteCount += 1; mapVoteCount.put(user, oldVoteCount); //2.判斷該用戶的投票類型,就相當(dāng)于判斷對應(yīng)的狀態(tài) //到底是正常投票、重復(fù)投票、惡意投票還是上黑名單的狀態(tài) 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(); } //然后轉(zhuǎn)調(diào)狀態(tài)對象來進行相應(yīng)的操作 state.vote(user, voteItem, this); }}

OK,測試一下

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

這里寫圖片描述

從上面的示例可以看出,狀態(tài)的轉(zhuǎn)換基本上都是內(nèi)部行為,主要在狀態(tài)模式內(nèi)部來維護。比如對于投票的人員,任何時候他的操作都是投票,但是投票管理對象的處理卻不一定一樣,會根據(jù)投票的次數(shù)來判斷狀態(tài),然后根據(jù)狀態(tài)去選擇不同的處理。

參考:《java與模式》之狀態(tài)模式


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 杭锦后旗| 阿图什市| 无棣县| 鄄城县| 军事| 雷山县| 麦盖提县| 长沙县| 紫云| 日土县| 晋中市| 昌黎县| 公安县| 宜丰县| 贺兰县| 清水河县| 平乡县| 湘潭县| 宁明县| 黎平县| 嘉兴市| 旅游| 华安县| 瓮安县| 石渠县| 华阴市| 扎鲁特旗| 灌云县| 大田县| 沛县| 福建省| 高邮市| 张家川| 玛沁县| 马边| 资阳市| 马公市| 宝山区| 车险| 东乌珠穆沁旗| 宜章县|