考慮一個在線投票的應用,要實現控制同一個用戶只能投一票,若是一個用戶反覆投票,並且投票次數超過5次,則斷定爲惡意刷票,要取消該用戶投票的資格,固然同時也要取消他所投的票。若是一個用戶的投票次數超過8次,將進入黑名單,禁止再登陸和使用系統。html
該怎麼實現這樣的功能呢?設計模式
分析上面的功能,爲了控制用戶投票,須要記錄用戶所投票的記錄,同時還要記錄用戶投票的次數,爲了簡單,直接使用兩個Map來記錄。學習
在投票的過程當中,又有四種狀況:測試
這幾種狀況下對應的處理是不同的。看看代碼吧,示例代碼以下:spa
/**設計 * 投票管理htm */blog public class VoteManager {ci /**rem * 記錄用戶投票的結果,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>(); /** * 投票 * @param user 投票人,爲了簡單,就是用戶名稱 * @param voteItem 投票的選項 */ public void vote(String user,String voteItem){ //1:先爲該用戶增長投票的次數 //先從記錄中取出已有的投票次數 Integer oldVoteCount = mapVoteCount.get(user); if(oldVoteCount==null){ oldVoteCount = 0; } oldVoteCount = oldVoteCount + 1; mapVoteCount.put(user, oldVoteCount);
//2:判斷該用戶投票的類型,究竟是正常投票、重複投票、惡意投票 //仍是上黑名單,而後根據投票類型來進行相應的操做 if(oldVoteCount==1){ //正常投票 //記錄到投票記錄中 mapVote.put(user, voteItem); System.out.println("恭喜你投票成功"); }else if(oldVoteCount>1 && oldVoteCount<5){ //重複投票 //暫時不作處理 System.out.println("請不要重複投票"); }else if(oldVoteCount >= 5 && oldVoteCount<8){ //惡意投票 //取消用戶的投票資格,並取消投票記錄 String s = mapVote.get(user); if(s!=null){ mapVote.remove(user); } System.out.println("你有惡意刷票行爲,取消投票資格"); }else if(oldVoteCount>=8){ //黑名單 //記入黑名單中,禁止登陸系統了 System.out.println("進入黑名單,將禁止登陸和使用本系統"); } } } |
寫個客戶端來測試看看,是否能知足功能要求,示例代碼以下:
public class Client { public static void main(String[] args) { VoteManager vm = new VoteManager(); for(int i=0;i<8;i++){ vm.vote("u1", "A"); } } } |
運行結果以下:
恭喜你投票成功 請不要重複投票 請不要重複投票 請不要重複投票 你有惡意刷票行爲,取消投票資格 你有惡意刷票行爲,取消投票資格 你有惡意刷票行爲,取消投票資格 進入黑名單,將禁止登陸和使用本系統 |
看起來很簡單,是否是?幸好這裏只是示意,不然,你想一想,在vote()方法中那麼多判斷,還有每一個判斷對應的功能處理都放在一塊兒,是否是有點太雜亂了,那簡直就是個大雜燴,若是把每一個功能都完整的實現出來,那vote()方法會很長的。
一個問題是:若是如今要修改某種投票狀況所對應的具體功能處理,那就須要在那個大雜燴裏面,找到相應的代碼塊,而後進行改動。
另一個問題是:若是要添加新的功能,好比投票超過8次但不足10次的,給個機會,只是禁止登陸和使用系統3天,若是再犯,才永久封掉帳號,該怎麼辦呢?那就須要改動投票管理的源代碼,在上面的if-else結構中再添加一個else if塊進行處理。
無論哪種狀況,都是在一大堆的控制代碼裏面找出須要的部分,而後進行修改,這歷來都不是好方法,那麼該如何實現才能作到:既可以很容易的給vote()方法添加新的功能,又可以很方便的修改已有的功能處理呢?
---------------------------------------------------------------------------
私塾在線學習網原創內容 跟着cc學設計系列 之 研磨設計模式
研磨設計討論羣【252780326】
原創內容,轉載請註明出處【http://sishuok.com/forum/blogPost/list/5619.html】
---------------------------------------------------------------------------