<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    項目重構之命令模式

        項目中有個業務處理類大小117K,代碼2700行,看此類差點雷死我,如今如要增加業務邏輯大約20個吧,此類如果隨著項目工程的二期、三期如次添加邏輯遲早有一天大小達到M,噢、mygod。細心研讀前人的工作總結,發現其中有點可改造的蛛絲馬跡(本人很笨、別笑我才發現如何改造)。

         下面我們對業務流程、以及涉及的相關類進行介紹,Msg代表接受到客戶端的一個消息報文,消息報文結構:消息頭+消息體,消息頭參數固定、消息體參數不定,下面是一個簡單的類圖,這只是一個模擬場景,****Req代表各戶端請求類,***Rsp代表返回給客戶端的參數類。實際比此復雜,為描述問題我們簡單摘除幾個類介紹,別問我為何這么設計繼承。類圖msgmsgHead是組合關系也許畫錯了、不當之處請指出,勿惡語向傷;

     


     

     處理請求Handler類的代碼邏輯如下:



    //類中主要方法如下
    public void execute(Object object) {
    Message message = (Message)object;
    int opcode = message.getOpcode();
    int connectId = message.getConnectId();
    //消息頭已經解析,獲取消息體,即子類屬性字節數組
    byte[] bytes = message.getBytes();
    if (opcode == MsgInfo.ADD_RING) {
    // 訂購彩鈴
    orderRing(connectId, bytes);
    } else if (opcode == MsgInfo.PRESENT_RING) {
    // 贈送彩鈴
    presentRing(connectId, bytes);
    } else if (opcode == MsgInfo.DEL_RING) {
    // 刪除個人鈴音
    delPersonalRing(connectId, bytes);
    }
    //此處省略n個else if
    }
    //其他刪除、贈送與省略的else if中的處理邏輯與之基本相同
    private void orderRing(int connectId, byte[] bytes) {
    //處理方法分為四步,具體代碼省略
    //1、解析字節數組為訂購鈴音類
    //2、處理訂購關系
    //3、處理結果封裝為訂購響應類
    //4、發送回客戶端
    }
    //省略presentRing、delPersonalRing等一系列其他方法,所有的處理方法參數相同……
    


        鑒于此、想到使用命令模式改造此類,如果不了解命令模式請閱讀相關書籍,大話設計模式或設計與模式,這里我們僅給出大致的定于與類圖。

    何謂命令模式:將一個請求封裝為一個對象,從而是你可用不同的請求對客戶端參數化,對請求排隊或記錄日志,以及支持可撤銷的操作。

     Shit、這句話很難理解哦,那就先別理解了,我們看下命令模式的類圖,然后介紹如何使用命令模式改造上面的elseif

    類圖先省略,上班偷空寫的;

     

    下面進入正題,對Handler小手術開始,主要考慮如下:

    1、提煉方法

         將每個if語句塊中的邏輯提取為一個方法,這里我們的handler已經實現,就是:orderRingpresentRing、delPersonalRing、……。

    2、提煉類

      將每個業務處理方法提取為以各類,然后對具體類進行抽象,提取父類或者接口;代碼如下:


    public Abstract class Command{
    public void execute()
    }
    public class OrderRingCommand extends Command {
    private Handler hander;
    public OrderRingCommand(Handler hander){
    this.hander = hander;
    }
    public void execute(int connectId, byte[] bytes){
    //1、解析字節數組為訂購鈴音類
    //2、增加訂購關系
    //3、處理結果封裝為訂購響應類
    //4、發送回客戶端
    }
    /**
    * 1、解析字節數組為訂購鈴音類
    */
    public void method1(){
    }
    /**
    * 2、處理訂購關系
    */
    public void method2(){
    }
    /**
    * 3、處理結果封裝為訂購響應類
    */
    public void method3(){
    }
    /**
    * 4、結果發送回客戶端
    */
    public void method4(){
    }
    }
    public class DelRingCommand extends Command {
    private Handler hander;
    public DelRingCommand(Handler hander){
    this.hander = hander;
    }
    public void execute(int connectId, byte[] bytes){
    //1、解析字節數組為訂購鈴音類
    //2、刪除購關系
    //3、處理結果封裝為訂購響應類
    //4、發送回客戶端
    }
    //提取方法
    }
    

      


    3、命令模式改造替換elseif:


    Map<Integer, Command> map = new HashMap<Integer,Command>();
    static{
    map.put(MsgInfo.ADD_RING, new OrderRingCommand());
    //省卻其他,這里僅為演示,實際項目中實例化類通過spring容器或者其他方法
    }
    public void execute(Object object) {
    Message message = (Message)object;
    int opcode = message.getOpcode();
    int connectId = message.getConnectId();
    //消息頭已經解析,獲取消息體,即子類屬性字節數組
    byte[] bytes = message.getBytes();
    map.get(opcode).execute(connectId,bytes);
    }
    


         

     命令模式替換else if代碼壞味道的重構結束,眾多的if條件塊煙消云散,取而代之的是一個個精簡的類,doc版本在附件中




     




     










    posted on 2011-05-10 21:03 空白 閱讀(358) 評論(0)  編輯  收藏 所屬分類: Java

    <2011年5月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類(15)

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲天天做日日做天天欢毛片| 亚洲一区二区视频在线观看| 久久国产亚洲电影天堂| 一本久久免费视频| 亚洲精品国产福利一二区| 直接进入免费看黄的网站| 亚洲日本在线观看视频| 一区二区3区免费视频| 亚洲乱码中文字幕综合| 中文字幕免费在线看电影大全| 亚洲一区二区三区免费观看| 亚洲免费中文字幕| 亚洲最大的黄色网| 精品国产免费一区二区| 疯狂做受xxxx高潮视频免费| 久久亚洲av无码精品浪潮| 日本免费A级毛一片| 亚洲成av人片不卡无码| 国产h视频在线观看免费| 亚洲a无码综合a国产av中文| 亚洲第一视频在线观看免费| APP在线免费观看视频| 亚洲最大在线视频| 国产精品自在自线免费观看| 久久久久免费视频| 亚洲欧洲日韩国产综合在线二区| 一本岛高清v不卡免费一三区| 亚洲第一街区偷拍街拍| 国产av无码专区亚洲av果冻传媒 | 91频在线观看免费大全| 久久亚洲AV成人无码国产最大| jlzzjlzz亚洲乱熟在线播放| 亚洲精品视频免费看| 亚洲精品第一国产综合亚AV| 亚洲一区二区三区在线播放| 国产成人精品免费午夜app| 国产精品亚洲综合网站| 91亚洲导航深夜福利| 午夜国产大片免费观看| 最近中文字幕电影大全免费版 | 中文字幕无码精品亚洲资源网久久 |