<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)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲一级片免费看| 国产久爱免费精品视频| 亚洲第一黄色网址| 成年女人午夜毛片免费视频| 久久国产乱子精品免费女| 男人和女人高潮免费网站| 97se亚洲国产综合自在线 | 国产精品久久久久免费a∨| 最近2019年免费中文字幕高清| 中文字幕久无码免费久久| 国产精品亚洲一区二区三区久久| 亚洲另类自拍丝袜第五页| 亚洲色偷偷综合亚洲AV伊人蜜桃| 亚洲国产成人九九综合| 亚洲欧洲日产v特级毛片| 国产精品亚洲精品| 日本在线观看免费高清| 又硬又粗又长又爽免费看| 韩日电影在线播放免费版| 1000部免费啪啪十八未年禁止观看| 99在线视频免费观看视频| 亚洲精品国产精品国自产观看| 亚洲欧洲日产国码无码久久99| 亚洲午夜免费视频| 另类图片亚洲校园小说区| a级毛片免费在线观看| 成年人免费观看视频网站| 亚洲免费视频在线观看| 色婷婷精品免费视频| 亚洲欧美日韩中文高清www777| 亚洲综合精品成人| av永久免费网站在线观看 | 亚洲欧洲国产视频| 一级毛片一级毛片免费毛片| 亚洲人成电影网站免费| 亚洲综合视频在线| 香蕉视频在线免费看| 久久九九久精品国产免费直播| 丁香六月婷婷精品免费观看| 亚洲成_人网站图片| 亚洲高清视频在线播放|