研磨設計模式 之 狀態模式(State)1——跟着cc學設計系列

18.1  場景問題

18.1.1  實如今線投票

考慮一個在線投票的應用,要實現控制同一個用戶只能投一票,若是一個用戶反覆投票,並且投票次數超過5次,則斷定爲惡意刷票,要取消該用戶投票的資格,固然同時也要取消他所投的票。若是一個用戶的投票次數超過8次,將進入黑名單,禁止再登陸和使用系統。html

該怎麼實現這樣的功能呢?設計模式

18.1.2  不用模式的解決方案

       分析上面的功能,爲了控制用戶投票,須要記錄用戶所投票的記錄,同時還要記錄用戶投票的次數,爲了簡單,直接使用兩個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");

       }

    }

}

運行結果以下:

恭喜你投票成功

請不要重複投票

請不要重複投票

請不要重複投票

你有惡意刷票行爲,取消投票資格

你有惡意刷票行爲,取消投票資格

你有惡意刷票行爲,取消投票資格

進入黑名單,將禁止登陸和使用本系統

18.1.3  有何問題

看起來很簡單,是否是?幸好這裏只是示意,不然,你想一想,在vote()方法中那麼多判斷,還有每一個判斷對應的功能處理都放在一塊兒,是否是有點太雜亂了,那簡直就是個大雜燴,若是把每一個功能都完整的實現出來,那vote()方法會很長的。

       一個問題是:若是如今要修改某種投票狀況所對應的具體功能處理,那就須要在那個大雜燴裏面,找到相應的代碼塊,而後進行改動。

另一個問題是:若是要添加新的功能,好比投票超過8次但不足10次的,給個機會,只是禁止登陸和使用系統3天,若是再犯,才永久封掉帳號,該怎麼辦呢?那就須要改動投票管理的源代碼,在上面的if-else結構中再添加一個else if塊進行處理。

無論哪種狀況,都是在一大堆的控制代碼裏面找出須要的部分,而後進行修改,這歷來都不是好方法,那麼該如何實現才能作到:既可以很容易的給vote()方法添加新的功能,又可以很方便的修改已有的功能處理呢?

 

---------------------------------------------------------------------------

私塾在線學習網原創內容  跟着cc學設計系列 之 研磨設計模式

研磨設計討論羣【252780326】

原創內容,轉載請註明出處【http://sishuok.com/forum/blogPost/list/5619.html

---------------------------------------------------------------------------

相關文章
相關標籤/搜索