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

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

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

    posts - 0,comments - 0,trackbacks - 0

    我們經常有對圖片進行處理的需求。本文就從最簡單的要求到比較復雜的要求描述面向對象的抽象方式

    下面假設調用方按照以下的協議進行調用:

    ImageManager  -src image_src_path  -resize 100x200 -rorate 90 -...
    -src表示來源圖片
    -resize 表示縮放
    ....

    需求1:對圖片進行縮放后存到指定的位置

    解決方法:
        很簡單,只需要兩個功能:縮放和存儲圖片的功能
    代碼1:
        public void processImage(String imageSrc,int newWidth, int newHeight,String imageDest){
            MyImage image = ... //讀取來源圖片
            MyImage newImg = resize(image,newWidth,newHeight);
            saveImage(newImage,imageDest);

            //剩下的是釋放資源的操作
        }

        private MyImage resize(MyImage image, int newWidth, int newHeigth){
            //縮放的代碼
        }
        private void saveImage(MyImage image, String destpath){
            //存儲的代碼
        }

    需求2:對圖片按照固定的順序(縮放、旋轉、剪切、銳化等,即命令行中resize 必須在 rorate之前)處理后保存新的圖片


    解決方法:
            依然簡單,按照代碼1的邏輯添加新處理圖片的方法即可
    代碼:
       
        public void processImage(ImageInfo info){// 這里的info存放的是操作所需要的信息,比如旋轉的角度等
           
            MyImage image = ... //讀取來源圖片
            MyImage newImg = resize(image,newWidth,newHeight);// 縮放
            newImg = rorate(...);//旋轉
            newImg = cut(...);//剪切
            newImg = sharpend(...)//銳化


            //釋放資源
        }


    需求3: 根據調用放輸入命令的前后順序對圖片進行處理.


    比如,輸入-resize 100x200 -rorate 90 :縮放-> 旋轉
    輸入-rorate 90 -resize 100x200 -cut 200x200 :旋轉->縮放->剪切

    解決方法:
         最直接的方法: 先獲取操作的前后順序,然后if-else搞定
     代碼3.1:
       
         public void processImage(ImageInfo info){// 這里的info存放的是操作所需要的信息,比如旋轉的角度等
           
            MyImage image = ... //讀取來源圖片
       
            List<String> operateList = ...// 獲取操作的先后順序,放在數組中
           
            for(String op : operateList){
                image = process(op, ...);
            }

            //釋放資源
        }
       
         public MyImage process(String op, ...){
           
            if(縮放){
                return resize(。。。)
            }

            if(旋轉){
                return rorate(..);
            }
            ...
         }


    需求4:在需求3的基礎上另外再加上10個操作。
    解決方法4.1 :
        在 public MyImage process(String op, ...)中添加新的if-else進行處理。

    優點:很直觀,很容易理解。
    缺點:1:if太多
          2:process方法過長
          3:每添加一個一個新的操作就要修改原來的邏輯代碼process(),這是非常危險的

    解決方法4.2:
          將對圖片的操作抽象為一個接口:
        interface ImageOperation{
            operate(ImageInfo info);
        }

        class RorateOperation implements ImageOperation{
            ...
        }
        ...

        static{
            map.put("rorate",new RorateOperation());
            ...
        }
         public void processImage(ImageInfo info){// 這里的info存放的是操作所需要的信息,比如旋轉的角度等
           
            MyImage image = ... //讀取來源圖片
       
            List<String> operateList = ...// 獲取操作的先后順序,放在數組中
           
            for(String op : operateList){
                Operator p = getOperator(op);
                p.operate(p);
            }

            //釋放資源
        }

        public ImageOperation getOperator(String op){
            return map.get(op);
        }

     好處:避免了過長的process();邏輯特別清晰;極大程度上支持開-閉原則
     缺點:將會創造比較多操作類,換來的好處就是每個類(算法)都特別精煉。

    posted on 2010-09-14 15:26 南國咖啡 閱讀(105) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 两个人日本WWW免费版| 国产精品亚洲一区二区无码| 国产免费久久久久久无码| 吃奶摸下高潮60分钟免费视频| 亚洲色大成网站www尤物| 欧美在线看片A免费观看| 国产精品亚洲精品青青青| 国产乱码免费卡1卡二卡3卡| 亚洲精品伊人久久久久| 在线jyzzjyzz免费视频| 男人的天堂av亚洲一区2区| 男人的天堂亚洲一区二区三区| 亚洲一日韩欧美中文字幕在线| 大学生a级毛片免费观看| 国产AV无码专区亚洲AV蜜芽| 亚洲AV无码一区二三区| 国产美女视频免费观看的网站| 亚洲国产精品无码中文字| 蜜桃视频在线观看免费视频网站WWW| 久久精品国产亚洲av影院| 亚洲中文无码永久免费| 蜜芽亚洲av无码一区二区三区| 亚洲精品国产高清嫩草影院| 三级网站免费观看| 亚洲欧洲日产专区| 国产免费人人看大香伊| fc2成年免费共享视频18| 激情内射亚洲一区二区三区| 9久9久女女免费精品视频在线观看 | 亚洲视频在线观看地址| 在线观看视频免费完整版| 中文字幕免费在线看线人 | 亚洲AV网一区二区三区 | 亚洲日韩中文无码久久| 黄网站免费在线观看| 亚洲依依成人精品| www国产亚洲精品久久久| 四虎国产精品永久免费网址| 亚洲日本在线电影| 精品国产亚洲一区二区三区| 精品熟女少妇AV免费观看|